Можно щелкнуть строки, чтобы выбрать их, и в этом случае они выделяются синим цветом (возможно, цвет зависит от ОС; я использую Windows 10). В определенный момент я должен иметь возможность сохранить этот выбор, а позже мне придется его восстановить. Мне почти удалось это сделать, но когда я восстанавливаю выделение, эти строки выделяются серым, а не синим. Я не понимаю почему и хотел бы знать, как это исправить.
Вот минимальный пример, записанный в виде одного файла, чтобы его было легче воспроизводить:
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
#include
#include
class TableViewExample : public QWidget
{
Q_OBJECT
public:
TableViewExample(QWidget *parent = nullptr)
: QWidget(parent)
{
// Create a custom TableModel
model = new QStandardItemModel(0, 3, this);
model->setHeaderData(0, Qt::Horizontal, "Name");
model->setHeaderData(1, Qt::Horizontal, "Age");
model->setHeaderData(2, Qt::Horizontal, "City");
// Populate the model with some rows
model->appendRow({ new QStandardItem("Alice"), new QStandardItem("30"), new QStandardItem("London") });
model->appendRow({ new QStandardItem("Bob"), new QStandardItem("35"), new QStandardItem("Paris") });
model->appendRow({ new QStandardItem("Charles"), new QStandardItem("18"), new QStandardItem("Rome") });
model->appendRow({ new QStandardItem("Dave"), new QStandardItem("28"), new QStandardItem("Berlin") });
model->appendRow({ new QStandardItem("Emily"), new QStandardItem("40"), new QStandardItem("Madrid") });
// Create a QSortFilterProxyModel and set the source model
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(model);
// Create a QTableView and set the proxy model as its model
tableView = new QTableView(this);
tableView->setModel(proxyModel);
tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
tableView->setSortingEnabled(true);
// Create buttons for saving and restoring the selection
QPushButton* saveButton = new QPushButton("Save Selection", this);
QPushButton* restoreButton = new QPushButton("Restore Selection", this);
// Connect the buttons to functions
connect(saveButton, &QPushButton::clicked, this, &TableViewExample::saveSelection);
connect(restoreButton, &QPushButton::clicked, this, &TableViewExample::restoreSelection);
// Create a layout and add the table view and buttons
QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(tableView);
layout->addWidget(saveButton);
layout->addWidget(restoreButton);
setLayout(layout);
// Make the window large enough to avoid scrollbars
setGeometry(100, 100, 340, 260);
// Center on screen
setGeometry( QStyle::alignedRect( Qt::LeftToRight,
Qt::AlignCenter,
size(),
QGuiApplication::primaryScreen()->availableGeometry() ) );
}
private slots:
void saveSelection()
{
savedSourceIndices.clear();
QModelIndexList proxyIndices = tableView->selectionModel()->selectedIndexes();
for (const QModelIndex& proxyIndex : proxyIndices) {
QModelIndex sourceIndex = proxyModel->mapToSource(proxyIndex);
savedSourceIndices.append(sourceIndex);
}
}
void restoreSelection()
{
tableView->selectionModel()->clearSelection();
for (const QModelIndex& savedIndex : savedSourceIndices)
{
tableView->selectionModel()->select(proxyModel->mapFromSource(savedIndex), QItemSelectionModel::Select);
//tableView->setCurrentIndex(proxyModel->mapFromSource(savedIndex));
}
}
private:
QTableView* tableView;
QStandardItemModel* model;
QSortFilterProxyModel* proxyModel;
QModelIndexList savedSourceIndices;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
TableViewExample example;
example.show();
return app.exec();
}
#include "main.moc"
Нажмите «Сохранить», выберите «Эмили», отсортируйте по городу (есть прокси, так что это обрабатывается), затем нажмите «Восстановить». Хотя он отменяет выбор Эмили и повторно выбирает Боба и Алису, линии становятся серыми, а не синими:
[img]https:/ /i.sstatic.net/nAXN8XPN.png[/img]
Я нашел ответ на форуме Qt, в котором упоминается, что помимо выбора есть еще и индекс. Я тоже пытался это изменить (см. строку с комментариями, вызывающую setCurrentIndex), но это тоже не работает (и поддерживает только одну строку, тогда как мне нужно иметь возможность выбрать много).У меня закончились идеи. Это ошибка?
Подробнее здесь: https://stackoverflow.com/questions/790 ... odelselect