2013-02-15 2 views
5

Ich habe ein Sqlite-Modell von mehreren 1000 Zeilen an eine QTableView angeschlossen. Ich kann die Zeilen in der QTableView anzeigen, aber wenn ich bis zum Ende der QTableView blättern kann, kann ich nur bis zum Ende der ersten paar 100 Zeilen kommen. Wenn ich weiter an der Bildlaufleiste klicke, werden neue Zeilen an die Ansicht angehängt, aber ich kann nicht einfach zum Ende blättern. Sobald alle Zeilen an die Ansicht angehängt sind, kann ich problemlos von oben nach unten scrollen.Wie scrollt man zur letzten Zeile eines SQLite-Modells in einer QTableView?

Hier ist der wichtige Teil des Codes (die nur Standard):

self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE") 
self.db.setDatabaseName(dbFileName) 

self.model = QtSql.QSqlTableModel(self.db) 
self.model.setTable("results") 
self.model.select() 
self.tableViewResults.setModel(self.model) 

ich etwas sehr einfach fehlen muss. Irgendwelche Vorschläge?

Laurence.

Antwort

6

QSqlTableModel lädt Daten träge, d. H. Es lädt die Elemente, wenn es angefordert wird. Und QTableView wird nach Artikeln fragen, wenn es benötigt wird Anzeige sie. Diese Verzögerung, die Sie beobachten, ist der Teil, der QSqlTableModel neue Daten aus der Datenbank abruft.

Es gibt auch an issue, wenn SQL-Treiber nicht Abfragegröße nicht berichten, und SQLite ist einer von ihnen:

Wenn die Datenbank nicht die Anzahl der ausgewählten Zeilen in einer Abfrage zurückgibt, die Das Modell ruft Zeilen inkrementell ab. Siehe fetchMore() für weitere Informationen .

Also das Modell weiß eigentlich nicht, wie viele es Elemente sein, bis es alle Elemente lädt.

Um die Verzögerung zu eliminieren Sie alle Daten vorher geladen werden sollte (wie fetchMore schon sagt):

self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE") 
self.db.setDatabaseName(dbFileName) 

self.model = QtSql.QSqlTableModel(self.db) 
self.model.setTable("results") 
self.model.select() 
while self.model.canFetchMore(): 
    self.model.fetchMore() 
self.tableViewResults.setModel(self.model) 
+0

Perfect! Genau das, was ich tun musste. – Lozzer