QTableView отображает выбранные строки синим цветом, но при использовании QItemSelectionModel::select они становятся серC++

Программы на C++. Форум разработчиков
Anonymous
QTableView отображает выбранные строки синим цветом, но при использовании QItemSelectionModel::select они становятся сер

Сообщение Anonymous »

Я работаю над программой на C++, которая использует Qt 6.6.1 для отображения таблицы.
Можно щелкнуть строки, чтобы выбрать их, и в этом случае они выделяются синим цветом (возможно, цвет зависит от ОС; я использую 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

Вернуться в «C++»