2016-12-08 33 views
1

我恰好有一个组合框和附加到它的QSortFilterProxyModel,它们按字母顺序排列项目。QSortFilterProxyModel:检索原始模型的项目或索引

原始模型(QComboBox)例如为:

“C”, “A”, “d”, “B”

已排序的模型(QSortFilterProxyModel)变为:

“A”, “B”, “C”, “d”

如果现在选择排序的组合框内 “d” 时,信号QCOM boBox :: currentIndexChanged(int)给我索引= 3,但我想检索索引相对于原始模型可能,所以索引= 2。

另一方面,我也想“原型” - > setCurrentIndex(idx)。但是,如果我定义了idx = 2,在组合框中突出显示的行显示“C”,因为视图已排序。

我该如何解决这个问题?

回答

3

首先,您需要获取组合框显示的模型的索引。使用QAbstractItemModel::index来做到这一点。组合框给出的“索引”是该行。

要从代理索引映射到源索引以及从源索引映射到代理索引,请分别使用QSortFilterProxyModel::mapToSourcemapFromSource

该视图对代理的索引进行操作,因此您从视图获得的任何索引都必须使用mapToSource映射到源模型。反之亦然,如果您对源模型中的索引进行操作,并且想要获取视图上的索引,请使用mapFromSource

例如为:

connect(myComboBox, &QComboBox::currentIndexChanged, [=](int row){ 
    auto proxy = static_cast<QAbstractProxyModel*>(myComboBox->model()); 
    auto const proxyIndex = proxy->index(row, 0); 
    auto source = proxy->sourceModel(); 
    auto const sourceIndex = proxy->mapToSource(proxyIndex); 
    ... 
}); 
+0

@LucaDanieli是。当然'QSortFilterProxyModel' **是一个''QAbstractItemModel'! –

+0

QSortFilterProxyModel :: index(row,0)是否有可能仅在ComboBox中选择行时才起作用?我试图mComboBox-> setCurrentIndex(proxyIndex)通过QModelIndex mIndex = mProxyModel->索引(modelIndex,0); QModelIndex proxyRow = mProxyModel-> mapFromSource(mIndex); int proxyIndex = proxyRow.row();不幸的是,int proxyIndex是“-1”。不过,ModelIndex是正确的 –

+0

模型上的方法将独立于视图所做的工作。所以选择并不重要。请更新这个问题,如果你有一些代码要问。 –