C++ QSortFilterProxyModel未返回有效索引

C++ QSortFilterProxyModel未返回有效索引,c++,qt5,qtreeview,qstandarditemmodel,qsortfilterproxymodel,C++,Qt5,Qtreeview,Qstandarditemmodel,Qsortfilterproxymodel,以下伪代码将用于解释我的问题: QTreeView* treeView = new QTreeView(); QStandardItemModel* sourceModel = new QStandardItemModel(); //sourceModel has seven columns and will be filled here with four rows QSortFilterProxyModel* sortFilterProxyModel = new QSortFilterPro

以下伪代码将用于解释我的问题:

QTreeView* treeView = new QTreeView();
QStandardItemModel* sourceModel = new QStandardItemModel();
//sourceModel has seven columns and will be filled here with four rows
QSortFilterProxyModel* sortFilterProxyModel = new QSortFilterProxyModel();

sortFilterProxyModel->setSourceModel(sourceModel);
treeView->setModel( sortFilterProxyModel );
现在,如果我调用
sortFilterProxyModel->rowCount()
我会得到正确的值
4
。如果我尝试从源模型获取第一行中第一列的索引,它将起作用:

QModelIndex idxOfFirstItem = sourceModel->index( 0, 0 );
现在,由于用户能够对视图进行排序,我想从代理模型中获取第一项的索引:

QModelIndex idxOfFirstItem = sortFilterProxyModel->index( 0, 0 );
无论行和列是什么,我总是在这里得到一个无效的索引。我做错了什么

解决方案:


好的,伙计们。我解决了这个问题。多亏了你的评论,我意识到实施应该是正确的。因此,我尝试了一些其他的事情,并意识到我有一个时间问题。我的实现试图在模型仍在更新时从模型中检索数据。因此,代理模型的源模型在更新期间无效。因此我没有得到有效的索引。在添加睡眠后,实现按我的需要工作。所以我必须同步程序中的一些事件。感谢您的启发:)

无效含义
idxOfFirstItem.isValid()
返回
false
或不能与
sourceModel
一起使用的含义?是,
idxOfFirstItem.isValid()
返回
false
。我想我知道你的想法。我没有尝试使用代理模型索引访问源模型项。最后我想调用
sortFilterProxyModel->mapToSource(idxOfFirstItem)
。但是,如果我没有从代理模型中获取有效的索引,这是不可能的。我忍不住注意到QSortFilterProxyModel文档中的以下句子:“QSortFilterProxyModel充当原始模型的包装器。如果需要将源QModelIndexes转换为排序/筛选的模型索引,或者反之亦然,请使用mapToSource(),mapFromSource(),mapSelectionToSource()和mapSelectionFromSource()。“您似乎需要mapFromSource()在代理模型的QModelIndex和源模型之间进行转换。我选中了
sortFilterProxyModel->sourceModel()->index(0,0)
返回有效索引。因此,源模型已正确设置。正如我在上一篇评论中所写,我知道代理模型是一个包装器,我必须使用
map…
函数。但是我想将一个索引从代理模型(这是一个将由用户通过对列进行排序来操纵的模型)映射到源模型。如果我没有从代理模型中得到正确的索引,这是不可能的。我无法使用无效索引调用
mapToSource
函数。通过快速测试,如果执行
sortFilterProxyModel->mapFromSource(sourceModel->index(0,0))
,会发生什么?这会导致有效或无效的模型索引吗?