我碰巧有一个ComboBox,并附有一个QSortFilterProxyModel,按字母顺序排列这些项目。
原始模型(QComboBox)例如:
“C”, “一个”, “d”, “B”
排序模型(QSortFilterProxyModel)变为:
“A”, “B”, “C”, “d”
如果我现在在已排序的comboBox中选择“D”,则信号QComboBox :: currentIndexChanged(int)给我index = 3,但我想检索相对于原始模型的索引,因此index = 2。
另一方面,我也想要“原型” - > gt; setCurrentIndex(idx)。但是,如果我定义idx = 2,则在组合框中突出显示的行显示“C”,因为视图已排序。
我该如何解决这个问题?
答案 0 :(得分:7)
首先,您需要获取组合框显示的模型的索引。使用QAbstractItemModel::index
来执行此操作。组合框给出的“索引”是行。
要从代理索引映射到源索引,从源索引映射到代理索引,请分别使用QSortFilterProxyModel::mapToSource
和mapFromSource
。
视图对代理的索引进行操作,因此必须使用mapToSource
将从视图中获取的任何索引映射到源模型。反之亦然,如果您对源模型中的索引进行操作,并希望获取视图上的索引,请使用mapFromSource
。
E.g:
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);
...
});