使用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
相关产品推荐
相关产品推荐

