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

如何从QSortFilterProxyModel映射回原ItemModel的行索引?

解决QSortFilterProxyModel索引映射到原始模型的问题

要把QTableView返回的排序后(代理模型)索引映射回原始ItemModel的行索引,直接用QSortFilterProxyModel提供的mapToSource()方法即可,核心逻辑是将代理模型的索引转换为原始数据源模型的索引,再提取行号。

具体实现步骤

  1. 获取代理模型的当前索引:从QTableView拿到的currentIndex()是代理模型(QSortFilterProxyModel)的索引,因为你的View是绑定到代理模型上的。
  2. 验证索引有效性:避免无效索引导致的错误操作。
  3. 映射到原始模型:调用代理模型的mapToSource()方法,把代理索引转换成原始ItemModel的索引。
  4. 提取原始行号:从转换后的原始索引中调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:24:55