Как обновить 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);
    }
}
}

Хорошо, теперь это более или менее работает ...

Ответы на вопрос(1)

Ваш ответ на вопрос