You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用QSortFilterProxyModel删除行时异常问题求助

QTableView排序与删除问题排查方案

问题1:启动默认降序,期望升序

检查你的QSortFilterProxyModel初始化逻辑:

  • 如果你调用了sort()方法,确认第二个参数是Qt::AscendingOrder而非Qt::DescendingOrder。正确的初始化示例:
    QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);
    proxyModel->setSourceModel(yourSourceModel);
    ui->tableView->setModel(proxyModel);
    // 按第0列升序排序,启动后立即生效
    proxyModel->sort(0, Qt::AscendingOrder);
    
  • 同时排查源模型的填充逻辑,确认没有在数据加载后自动触发降序排序的代码。

问题2:删除一行实际删除两行

这个问题几乎都是索引处理错误或删除顺序不当导致的,按以下步骤排查:

  1. 必须转换代理模型索引:QTableView::selectedIndexes()返回的是代理模型的索引,直接用它删除会导致映射错误。需要先通过mapToSource()转换为源模型索引,再执行删除。示例代码:
    QModelIndexList selected = ui->tableView->selectedIndexes();
    if (!selected.isEmpty()) {
        // 去重,一行的多列索引只保留一个行号
        QSet<int> targetRows;
        foreach (const QModelIndex &idx, selected) {
            targetRows.insert(proxyModel->mapToSource(idx).row());
        }
        // 逆序删除,避免行号偏移
        QList<int> rowList = targetRows.toList();
        qSort(rowList.begin(), rowList.end(), qGreater<int>());
        foreach (int row, rowList) {
            yourSourceModel->removeRow(row);
        }
    }
    
  2. 避免正向遍历删除:如果从前往后遍历选中行删除,删除第一行后源模型的行号会整体前移,下一次删除的实际是原第三行,看起来像一次删了两行。必须从大到小逆序删除,保证每次操作的行号都是当前模型的正确位置。
  3. 检查删除逻辑有没有重复触发的情况:比如信号槽重复连接、代码中误写了两次removeRow()调用。

内容的提问来源于stack exchange,提问作者Eurydice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:09:22