QTableView,QSQLQueryModel

Alles rund um die Programmierung mit Qt
Antworten
mozarella
Beiträge: 2
Registriert: 26. August 2010 14:37

QTableView,QSQLQueryModel

Beitrag 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!
philistion
Beiträge: 22
Registriert: 8. Februar 2010 09:37

Beitrag 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
mozarella
Beiträge: 2
Registriert: 26. August 2010 14:37

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

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