如何从QSortFilterProxyModel映射回原ItemModel的行索引?
解决QSortFilterProxyModel索引映射到原始模型的问题
要把QTableView返回的排序后(代理模型)索引映射回原始ItemModel的行索引,直接用QSortFilterProxyModel提供的mapToSource()方法即可,核心逻辑是将代理模型的索引转换为原始数据源模型的索引,再提取行号。
具体实现步骤
- 获取代理模型的当前索引:从QTableView拿到的
currentIndex()是代理模型(QSortFilterProxyModel)的索引,因为你的View是绑定到代理模型上的。 - 验证索引有效性:避免无效索引导致的错误操作。
- 映射到原始模型:调用代理模型的
mapToSource()方法,把代理索引转换成原始ItemModel的索引。 - 提取原始行号:从转换后的原始索引中调用
row(),得到的就是你ItemModel._rows中的原始索引。
代码示例(以删除槽函数为例)
void YourClass::on_del_clicked() { // 获取当前选中的代理模型索引 QModelIndex proxyIndex = ui->tableView->currentIndex(); if (!proxyIndex.isValid()) { return; // 无选中项直接返回 } // 将代理索引映射到原始模型 QModelIndex sourceIndex = m_proxyModel->mapToSource(proxyIndex); int originalRow = sourceIndex.row(); // 操作原始模型的_rows,比如删除对应行 m_itemModel->_rows.removeAt(originalRow); // 通知模型数据更新 m_itemModel->beginRemoveRows(QModelIndex(), originalRow, originalRow); m_itemModel->endRemoveRows(); }
补充说明
- 如果是添加操作后需要定位到新行,反过来可以用
mapFromSource()把原始模型的索引转换成代理模型的索引,再调用tableView->setCurrentIndex()让View定位到对应位置。 - 若存在多选场景,需要遍历所有选中的代理索引,逐个调用
mapToSource()转换后处理。
内容的提问来源于stack exchange,提问作者ZioByte
相关产品推荐
相关产品推荐

