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

使用QSortFilterProxyModel过滤QTableView条目时选择模型返回错误索引的问题咨询

解决QSortFilterProxyModel过滤后获取正确选中索引的问题

哈哈,这个问题我之前做Qt表格过滤的时候也踩过坑!本质是没搞清楚代理模型(QSortFilterProxyModel)和源模型(QStandardItemModel)的索引映射关系——你从selectionModel拿到的currentChanged信号参数,是代理模型的索引,不是源模型的,直接用它的行号对应源模型的行号,肯定会因为隐藏条目出问题。

给你两种常用的解决方式,看你需求选:

1. 获取源模型里的正确索引

如果你需要的是原始QStandardItemModel中对应条目的索引(比如你说的原第5条的行号),直接用代理模型的mapToSource()方法把代理索引转换成源模型的索引就行:

// 假设你的代理模型对象是proxyModel,在currentChanged的槽函数里这么写:
void onCurrentChanged(const QModelIndex& currentProxyIdx, const QModelIndex& previousProxyIdx) {
    if (!currentProxyIdx.isValid()) return;
    
    // 把代理索引转换为源模型索引
    QModelIndex sourceIdx = proxyModel->mapToSource(currentProxyIdx);
    // 现在sourceIdx.row()就是源模型里的正确行号(注意Qt里行号从0开始,原第5条的行号是4)
    qDebug() << "源模型中对应的行号:" << sourceIdx.row();
}

2. 获取视图显示的条目序号

如果你只是需要当前选中条目在QTableView里显示的位置(比如你说的“第5条”,也就是视图里的第5个可见条目),直接用代理索引的row()就行——因为代理模型的行号已经是过滤后的显示顺序了:

void onCurrentChanged(const QModelIndex& currentProxyIdx, const QModelIndex& previousProxyIdx) {
    if (!currentProxyIdx.isValid()) return;
    
    // 视图里的显示序号(如果要从1开始计数就加1,从0开始就直接用row())
    int visibleItemNum = currentProxyIdx.row() + 1;
    qDebug() << "视图中显示的条目序号:" << visibleItemNum;
}

最后提醒一句:QTableView的selectionModel是和它当前设置的model绑定的,你给视图设的是代理模型,所以拿到的索引自然是代理模型的,一定要做映射转换,别直接拿去访问源模型的数据哦!


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:22:33