Как обновить 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(), который был бы идеальным.

Кто-нибудь из вас знает , как я мог бы обновить таблицу, чтобы отразить изменения в базе данных(либо в результате использования командной строки, либо в результате других экземпляров программы) И сохранить текущий выбор?

Я знаю, что могу получить данные из текущего выбора, а затем после сброса выполнить поиск той же строки, а затем выбрать ее повторно, но это кажется контрпродуктивным и плохим решением проблемы.

РЕДАКТИРОВАТЬ: Текущая попытка решения:

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);
    }
}
}

Итак, теперь это более или менее работает...

12
задан RAM 11 May 2018 в 03:49
поделиться