У меня есть QTableView table
. Данные для таблицы предоставляются как QStandardItemModel model
, но данные могут быть отсортированы по 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});
Теперь, когда пользователь выбирает строки, я хотел бы знать, какие QStandardItems
выбраны. Я пытался так:
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
- но ее там нет.
Или, может быть, есть более стандартный способ сделать это, без индексов строк вообще?