ich habe ein Problem mit der Sortierung von Daten einer SQLite-Tabelle mit Hilfe von QSortFilterProxyModel.
Hier ist ein Minimalbeispiel, dass den Fehler zeigt:
main.cpp
Code: Alles auswählen
#include <QApplication>
#include <QMainWindow>
#include <QTableView>
#include <QSqlQuery>
#include <QSqlQueryModel>
#include <QSortFilterProxyModel>
int main(int argc, char *argv[])
{
//create test data
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory");
db.open();
QSqlQuery query(QSqlDatabase::database());
//clean up before
query.exec("DELETE FROM testtable");
query.exec("DROP TABLE testtable");
//new table and some manually created rows
query.exec("CREATE TABLE testtable(col1 INTEGER, col2 INTEGER, col3 INTEGER)");
query.exec("INSERT INTO testtable VALUES(1234, random(), random())");
query.exec("INSERT INTO testtable VALUES(4567, random(), random())");
query.exec("INSERT INTO testtable VALUES(3456, random(), random())");
query.exec("INSERT INTO testtable VALUES(2345, random(), random())");
//300 automatically generated data rows
for(int i = 0; i < 300; i++)
{
int c1 = 5000 + i;
int c2 = rand() % 2000 + 1000;
int c3 = rand() % 2000 + 1000;
query.prepare("INSERT INTO testtable (col1, col2, col3) VALUES(:col1, :col2, :col3)");
query.bindValue(":col1", c1);
query.bindValue(":col2", c2);
query.bindValue(":col3", c3);
query.exec();
}
//a last manually data set that should appear in row 2 if sorted
query.exec("INSERT INTO testtable VALUES(1357, random(), random())");
//create table model
QSqlQueryModel* sqlQueryModel = new QSqlQueryModel();
sqlQueryModel->setQuery("SELECT * FROM testtable", QSqlDatabase::database());
//create proxy model
QSortFilterProxyModel* sortFilterProxyModel = new QSortFilterProxyModel();
sortFilterProxyModel->setSourceModel(sqlQueryModel);
sortFilterProxyModel->sort(0);
//create GUI and connect with data
QApplication app(argc, argv);
QMainWindow *mainWindow = new QMainWindow();
QTableView* tableView = new QTableView();
mainWindow->setCentralWidget(tableView);
tableView->setModel(sortFilterProxyModel);
mainWindow->showMaximized();
return app.exec();
}
Code: Alles auswählen
SOURCES += main.cpp
TEMPLATE = app
LANGUAGE = C++
CONFIG += qt warn_on debug_and_release
TARGET = test
QT += sql
Diese Tabelle wird von einem QSqlQueryModel geladen. Wenn nur dieses in der QTableView angezeigt wird, sieht man die unsortierten Daten.
Ich will aber nach der ersten Spalte sortieren und erzeuge ein QSortFilterProxyModel.
Dieses zeigt die ersten 256 Zeilen auch richtig sortiert an, nur fehlt in Zeile 2 der letzte Datensatz der SQLite-Tabelle. Beim runterscrollen, kurz bevor Zeile 257 sichtbar würde, werden anscheinend Daten nachgeladen, der Scrollbalken wird kleiner und der Rest der Daten ist verfügbar. Wenn ich jetzt wieder hochscrolle, steht dort der verschwundene Datensatz an der richtigen Stelle. Die Daten scheinen also stückweise in 256-Zeilen-Häppchen geladen zu werden und es werden nur die bisher geladenen Daten sortiert.
Ist das ein Fehler? Wenn nicht, wie kann ich erreichen, dass die gesamte Tabelle vollständig geladen und richtig sortiert angezeigt wird?
Bin für jeden Hinweis dankbar!
Grüße,
Gernot