QSortFilterProxyModel:检索原始模型

时间:2016-12-08 14:34:11

标签: qt

我碰巧有一个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”,因为视图已排序。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:7)

首先,您需要获取组合框显示的模型的索引。使用QAbstractItemModel::index来执行此操作。组合框给出的“索引”是行。

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

视图对代理的索引进行操作,因此必须使用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);
  ...
});