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();
}
收益指数;
}