使用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:删除一行实际删除两行
这个问题几乎都是索引处理错误或删除顺序不当导致的,按以下步骤排查:
- 必须转换代理模型索引:
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); } } - 避免正向遍历删除:如果从前往后遍历选中行删除,删除第一行后源模型的行号会整体前移,下一次删除的实际是原第三行,看起来像一次删了两行。必须从大到小逆序删除,保证每次操作的行号都是当前模型的正确位置。
- 检查删除逻辑有没有重复触发的情况:比如信号槽重复连接、代码中误写了两次
removeRow()调用。
内容的提问来源于stack exchange,提问作者Eurydice
相关产品推荐
相关产品推荐

