QTableView-如何了解在排序表中选择了哪些项?

QTableView-如何了解在排序表中选择了哪些项?,qt,Qt,我有一个QTableView表。该表的数据由QStandardItemModel提供,但数据可以按QSortFilterProxyModel排序。即: auto *header = ui.table->horizontalHeader(); // ... some configuration of header auto *sorted = new QSortFilterProxyModel(window); QObject::connect(header, &QHeaderVie

我有一个
QTableView表
。该表的数据由
QStandardItemModel
提供,但数据可以按
QSortFilterProxyModel
排序。即:

auto *header = ui.table->horizontalHeader();
// ... some configuration of header
auto *sorted = new QSortFilterProxyModel(window);
QObject::connect(header, &QHeaderView::sortIndicatorChanged, sorted, &QSortFilterProxyModel::sort);
sorted->setSourceModel(model);
ui.table->setModel(sorted);
我在表中插入的所有元素都是
QStandardItem
,添加方式如下:

QStandardItem* item = new QStandardItem("some data");
model->appendRow({item});
QObject::connect(ui.table->selectionModel(), &QItemSelectionModel::selectionChanged, this,
                 [this](const QItemSelection &selected, const QItemSelection &deselected) {
    QModelIndexList selectedIdxs = selected.indexes();
    for(QModelIndex &idx : selectedIdxs) {
        QStandardItem* item = model->item(idx.row());
        //'item' is what I need, do something with it
    }
});
现在,当用户选择行时,我想知道选择了哪些
qstandarditem
。我试着这样做:

QStandardItem* item = new QStandardItem("some data");
model->appendRow({item});
QObject::connect(ui.table->selectionModel(), &QItemSelectionModel::selectionChanged, this,
                 [this](const QItemSelection &selected, const QItemSelection &deselected) {
    QModelIndexList selectedIdxs = selected.indexes();
    for(QModelIndex &idx : selectedIdxs) {
        QStandardItem* item = model->item(idx.row());
        //'item' is what I need, do something with it
    }
});
一开始效果不错。然而,当我对数组进行排序时,我意识到行索引不是它们应该在的位置!如果排序后的元素是第一个,
idx.row()
似乎返回0,但是
model
对排序一无所知

所以我的问题是,如何将排序后的索引转换为原始索引?我希望找到一个类似的函数,返回一个
QStandardItem*
QSortFilterProxyModel::item
——但它不存在


或者可能有一种更标准的方法,不使用任何行索引?

您可以将这些索引存储为行的列表

QPersistentModelIndex是可由 应用程序,然后用于访问模型中的信息。不像 在QModelIndex类中,存储QPersistentModelIndex是安全的 因为模型将确保对项目的引用将继续 只要模型可以访问它们,它们就有效


由于您使用的是
QSortFilterProxyModel
,因此也可以使用
QSortFilterProxyModel::mapToSource()
来存储源模型的实际项,在对代理模型排序时,这些项不应失效。然后,您可以通过“代码”> QSORTFILTEPROXYME::MAPFaseStase< /代码>,当您需要与它们进行操作时,获得相反的动作,并获得代理项。
[this](const QItemSelection &selected, const QItemSelection &deselected)
  {
    QModelIndexList selectedIdxs = selected.indexes();
    for (QModelIndex &idx: selectedIdxs) {
      QStandardItem *item = model->item(idx.row());
      //'item' is what I need, do something with it
    }
  }
问题在于
QModelIndex
idx
QSortFilterProxyModel
关联,而不是与
QStandardItemModel
关联。在这种情况下,您需要使用将
idx
映射到
QStandardItemModel
中相应的
QModelIndex
。假设包含的类有一个名为
sorted
QSortFilterProxyModel*
数据成员,那么代码将变成

[this](const QItemSelection &selected, const QItemSelection &deselected)
  {
    QModelIndexList selectedIdxs = selected.indexes();
    for (QModelIndex &idx: selectedIdxs) {
      auto source_idx = sorted->mapToSource(idx);
      QStandardItem *item = model->item(source_idx.row());
      //'item' is what I need, do something with it
    }
  }
除此之外,您还可以编写一个函数,迭代地映射模型索引,直到关联的模型不再是代理模型。类似于(未经测试的)

QModelIndex映射到源(QModelIndex索引)
{
const auto*model=index.model();
对于(const auto*pm=dynamic_cast(model);pm;
pm=动态(模型){
index=pm->mapToSource(index);
model=pm->sourceModel();
}
收益指数;
}