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