Wie aktualisiere ich ein QSqlTableModel unter Beibehaltung der Auswahl?

Ich benutze eineQSqlTableModel undQTableView Anzeigen einer SQLite-Datenbanktabelle.

Ich möchte, dass die Tabelle etwa jede Sekunde automatisch aktualisiert wird (es wird keine sehr große Tabelle - ein paar hundert Zeilen). Und das kann ich - so:

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*
}

Aber das entfernt jede Auswahl, die ich habe, so dass die Auswahl nur bis zu einer Sekunde dauert. Dies ist ärgerlich, da ein weiterer Bereich in der Benutzeroberfläche von der Auswahl abhängt. Wenn nichts ausgewählt ist, wird es auf eine Begrüßungsseite zurückgesetzt.

Ich habe dann einen etwas hackigen Ansatz versucht, bei dem die ausgewählte Zeilennummer abgerufen, die Tabelle zurückgesetzt und dann diese Zeile ausgewählt wird. Dies funktioniert jedoch auch nicht, da die ausgewählte Zeile aufgrund von Hinzufügungen zur Tabelle nach oben oder unten verschoben werden kann.

Ich weiß, andere Klassen haben einedataChanged() Signal, das wäre ideal.

Weiß einer von euch Bescheid?wie ich die Tabelle aktualisieren lassen könnte, um Änderungen an der Datenbank widerzuspiegeln (entweder über die Befehlszeile oder über andere Instanzen des Programms)UND die aktuelle Auswahl behalten?

Ich weiß, dass ich Daten aus der aktuellen Auswahl abrufen und nach dem Zurücksetzen nach derselben Zeile suchen und sie dann erneut auswählen kann, aber dies scheint eine kontraproduktive und schlechte Lösung für das Problem zu sein.

EDIT: Aktueller Lösungsversuch:

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

Okay, das funktioniert jetzt mehr oder weniger ...

Antworten auf die Frage(1)

Ihre Antwort auf die Frage