【问题标题】:QSortFilterProxyModel: retrieve the item or index of the original modelQSortFilterProxyModel:检索原始模型的项或索引
【发布时间】:2016-12-08 14:34:11
【问题描述】:

我碰巧有一个 ComboBox 和一个 QSortFilterProxyModel 附加到它,按字母顺序排列项目。

原始模型(QComboBox)例如:

"C", “一种”, "D", “乙”

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

"A", "乙", “C”, “D”

如果我现在在排序的组合框中选择“D”,则信号 QComboBox::currentIndexChanged(int) 给我 index=3,但我想检索相对于原始模型的索引,因此 index=2。

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

我该如何解决这个问题?

【问题讨论】:

    标签: qt


    【解决方案1】:

    首先,您需要获取组合框显示的模型的索引。使用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);
      ...
    });
    

    【讨论】:

    • QSortFilterProxyModel::index(row, 0) 是否可能仅在 ComboBox 中选择行时才有效?我正在尝试 mComboBox->setCurrentIndex(proxyIndex) 通过 QModelIndex mIndex = mProxyModel->index(modelIndex, 0); QModelIndex proxyRow = mProxyModel->mapFromSource(mIndex); int proxyIndex = proxyRow.row();不幸的是,int proxyIndex 为“-1”。不过,ModelIndex 是正确的
    • 模型上的方法将独立于视图正在执行的操作。所以选择并不重要。如果您有一些代码要询问,请更新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 2020-09-21
    相关资源
    最近更新 更多