Seite 1 von 1

QTableView,QSQLQueryModel

Verfasst: 30. August 2010 12:16
von mozarella
Hallo
Ich habe eine SQLite Datenbank. Zur Abfrage benutzte ich ein
QSQLQueryModel, welches ich dann zur Anzeige an ein QTableView übergebe.
Wie kann ich nach dem erstmaligen Abfragen und nach dem Einfügen von
Datensätzen erreichen, dass im Tableview immer der letzte Datensatz
angezeigt wird. Der letzte Datensatz ist dabei immer auch der zuletzt
eingefügte, da die Sortierung (ORDER BY) ein TIMESTAMP Feld benutzt
und der zuletzt eingefügte Datensatz in diesem Feld immer den jüngsten
Zeitstempel besitzt.
Codeauszug erstmalige Abfrage:

Code: Alles auswählen

 db = QSqlDatabase::addDatabase("QSQLITE"); 
 db.setDatabaseName(fn);
 if (db.open())
 {
    queryModel = new QSqlQueryModel(tableView);
    queryModel->setQuery("SELECT * FROM eventlog ORDER BY Zeit1", db);
    if(queryModel->lastError().type() == QSqlError::NoError)
    {
       tableView->setModel(queryModel);
     }
 }

Ein tableView->scrollToBottom() zeigt nicht den gewünschten Effekt.


Nach dem Einfügen eines Datensatzes mittels INSERT INTO ... rufe ich jedesmals das
SELECT wieder auf, um Model und TableView zu aktualisieren.
Geht das eleganter( sprich performanter)?

Hat jemand eine Idee?

Viele Grüße und Danke!

Verfasst: 30. August 2010 12:49
von philistion
Hallo!

Ich mache das so:

Code: Alles auswählen

myModel->setQuery(szQuery, sqlDatabase); /* <- Aktualisieren bzw. Neu abfragen */
QScrollBar *scrollBar = ui->tableView->verticalScrollBar();
scrollBar->setValue(scrollBar->maximum()); /* Zur aktuellen Zeile scrollen */
mfG

Verfasst: 30. August 2010 15:12
von mozarella
Danke für die Antwort.
Leider funktioniert das nicht.
Es zeigt sich derselbe Effekt wie bei tableView->scrollToBottom()
Es wird dabei zum 511. Datensatz gesprungen (verticalHeader)
Die Abfrage

Code: Alles auswählen

  rcount = queryModel->rowCount();
  setStatusBarElementText("Anzahl Einträge: "+QString::number(rcount),3);

liefert auch 511 obwohl in der Datenbank ca. 15000 Datensätze enthalten
sind und auch alle im Select liegen. Offenbar liegt das an den "gecachten"
Datensätzen.
Da kommt jetzt die Frage auf, wie kann man den Cache einstellen oder
gibt es andere Lösungen?

Verfasst: 30. August 2010 15:40
von upsala

Code: Alles auswählen

while (myModel->canFetchMore())
     myModel->fetchMore();