Я использую 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()
, который был бы идеальным.
Кто-нибудь из вас знает , как я мог бы обновить таблицу, чтобы отразить изменения в базе данных(либо в результате использования командной строки, либо в результате других экземпляров программы) И сохранить текущий выбор?
Я знаю, что могу получить данные из текущего выбора, а затем после сброса выполнить поиск той же строки, а затем выбрать ее повторно, но это кажется контрпродуктивным и плохим решением проблемы.
РЕДАКТИРОВАТЬ: Текущая попытка решения:
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);
}
}
}
Итак, теперь это более или менее работает...