Jak odświeżyć QSqlTableModel, zachowując wybór?
UżywamQSqlTableModel
iQTableView
aby wyświetlić tabelę bazy danych SQLite.
Chciałbym mieć odświeżanie tabeli co sekundę lub mniej (nie będzie to bardzo duży stół - kilkaset wierszy). I mogę to zrobić - tak:
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*
}
Usuwa to jednak wszystkie moje wybory, więc selekcje trwają tylko do sekundy. Jest to denerwujące, ponieważ inne okienko w GUI zależy od tego, co zostało wybrane. Jeśli nic nie jest zaznaczone, resetuje się do strony powitania objaśniającej.
Następnie spróbowałem nieco hackiego podejścia, które pobiera wybrany numer wiersza, resetuje tabelę, a następnie wybiera ten wiersz. Ale to też nie działa, ponieważ wybrany wiersz może przesuwać się w górę lub w dół w oparciu o dodatki do tabeli.
Wiem, że inne klasy majądataChanged()
sygnał, który byłby idealny.
Czy ktokolwiek z was wiejak mogłem odświeżyć tabelę, aby odzwierciedlić zmiany w bazie danych (z użycia wiersza poleceń lub innych instancji programu)I zachować bieżący wybór?
Wiem, że mogę uzyskać dane z bieżącej selekcji, a następnie po zresetowaniu wyszukać ten sam wiersz, a następnie ponownie go wybrać, ale wydaje się to być wydajnym i złym rozwiązaniem problemu.
EDYCJA: Bieżąca próba rozwiązania:
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);
}
}
}
Dobra, to mniej więcej działa teraz ...