我碰巧有一个ComboBox,并附有一个QSortFilterProxyModel,它按字母顺序排列项目.
原始模型(QComboBox)例如:
"C","A","D","B"
排序模型(QSortFilterProxyModel)变为:
"A B C D"
如果我现在在排序的comboBox中选择"D",信号QComboBox :: currentIndexChanged(int)给我index = 3,但我想检索相对于原始模型的索引,所以index = 2.
另一方面,我也想"原型" - > setCurrentIndex(idx).但是,如果我定义idx = 2,则在comboBox中突出显示的行显示"C",因为视图已排序.
我该如何解决这个问题?
首先,您需要获取组合框显示的模型的索引.使用QAbstractItemModel::index这样做.组合框给出的"索引"是行.
要从代理索引映射到源索引,从源索引映射到代理索引,请分别使用QSortFilterProxyModel::mapToSource和mapFromSource.
视图对代理的索引进行操作,因此从视图中获取的任何索引都必须使用映射到源模型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);
...
});
Run Code Online (Sandbox Code Playgroud)