Как обновить QSqlTableModel при сохранении выделения?
Я используюQSqlTableModel
а такжеQTableView
просмотреть таблицу базы данных SQLite.
Я хотел бы, чтобы таблица автоматически обновлялась каждую секунду или около того (она не будет очень большой таблицей - пара сотен строк). И я могу сделать это - вот так:
QTimer *updateInterval = new QTimer(this);
updateInterval->setInterval(1000);
updateInterval->start();
connect(updateInterval, SIGNAL(timeout()),this, SLOT(update_table()));
...
void MainWindow::update_table()
{
model->select(); //QSqlTableModel*
sqlTable->reset(); //QTableView*
}
Но это удаляет любой выбор, который у меня есть, так что выбор длится только до секунды. Это раздражает, так как другая панель в графическом интерфейсе зависит от того, что выбрано. Если ничего не выбрано, то оно сбрасывается на заставку с пояснениями.
Затем я попробовал несколько хакерский подход, который получает выбранный номер строки, сбрасывает таблицу и затем выбирает эту строку. Но это также не работает, поскольку выбранная строка может перемещаться вверх или вниз в зависимости от добавлений в таблицу.
Я знаю, что другие классы имеютdataChanged()
сигнал, который был бы идеальным.
Кто-нибудь из вас знаетhow I could have the table refresh to reflect changes to the database (либо из командной строки, либо из других экземпляров программы)AND keep the current selection?
Я знаю, что могу получить данные из текущего выбора, а затем после сброса найти ту же строку и затем повторно выбрать ее, но это кажется контрпродуктивным и плохим решением проблемы.
РЕДАКТИРОВАТЬ: Текущая попытка решения:
void MainWindow::update_table()
{
QList<QModelIndex> selection = sqlTable->selectionModel()->selection().indexes();
QList<int> selectedIDs;
bool somethingSelected = true;
for(QList<QModelIndex>::iterator i = selection.begin(); i != selection.end(); ++i){
int col = i->column();
QVariant data = i->data(Qt::DisplayRole);
if(col == 0) {
selectedIDs.append(data.toInt());
}
}
if(selectedIDs.empty()) somethingSelected = false;
model->select();
sqlTable->reset();
if(somethingSelected){
QList<int> selectedRows;
int rows = model->rowCount(QModelIndex());
for(int i = 0; i < rows; ++i){
sqlTable->selectRow(i);
if(selectedIDs.contains(sqlTable->selectionModel()->selection().indexes().first().data(Qt::DisplayRole).toInt())) selectedRows.append(i);
}
for(QList<int>::iterator i = selectedRows.begin(); i != selectedRows.end(); ++i){
sqlTable->selectRow(*i);
}
}
}
Хорошо, теперь это более или менее работает ...