Verwendung von SQL-Datenbanken mit Qt Quick Views
SQL-Modelle
Qt bietet C++-Klassen, die SQL-Datenmodelle unterstützen. Diese Klassen arbeiten transparent mit den zugrundeliegenden SQL-Daten und reduzieren die Notwendigkeit, SQL-Abfragen für grundlegende SQL-Operationen wie Erstellen, Einfügen oder Aktualisieren auszuführen. Weitere Einzelheiten zu diesen Klassen finden Sie unter Verwendung der SQL-Modellklassen.
Obwohl die C++-Klassen vollständige Funktionssätze für die Bearbeitung von SQL-Daten bereitstellen, bieten sie keinen Datenzugriff auf QML. Daher müssen Sie ein benutzerdefiniertes C++-Datenmodell als Unterklasse einer dieser Klassen implementieren und es QML entweder als Typ oder Kontexteigenschaft zur Verfügung stellen.
Nur-Lese-Datenmodell
Das benutzerdefinierte Modell muss die folgenden Methoden reimplementieren, um den Nur-Lese-Zugriff auf die Daten von QML aus zu ermöglichen:
- roleNames(), um die Rollennamen für das QML-Frontend freizugeben. Die folgende Version gibt zum Beispiel die Feldnamen der ausgewählten Tabelle als Rollennamen zurück:
QHash<int, QByteArray> SqlQueryModel::roleNames() const { QHash<int, QByteArray> roles; // record() returns an empty QSqlRecord for (int i = 0; i < this->record().count(); i ++) { roles.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8()); } return roles; }
- data(), um SQL-Daten für das QML-Frontend bereitzustellen. Die folgende Implementierung gibt zum Beispiel Daten für den angegebenen Modellindex zurück:
QVariant SqlQueryModel::data(const QModelIndex &index, int role) const { QVariant value; if (index.isValid()) { if (role < Qt::UserRole) { value = QSqlQueryModel::data(index, role); } else { int columnIdx = role - Qt::UserRole - 1; QModelIndex modelIndex = this->index(index.row(), columnIdx); value = QSqlQueryModel::data(modelIndex, Qt::DisplayRole); } } return value; }
Die Klasse QSqlQueryModel ist gut genug, um ein benutzerdefiniertes Nur-Lese-Modell zu implementieren, das Daten in einer SQL-Datenbank darstellt. Das Chat-Tutorial-Beispiel demonstriert dies sehr gut, indem es ein benutzerdefiniertes Modell implementiert, um die Kontaktdetails aus einer SQLite-Datenbank zu holen.
Editierbares Datenmodell
QSqlTableModel bietet ein editierbares Datenmodell für eine einzelne Datenbanktabelle und implementiert setData() wie in der Übersichtsdokumentation zur Model/View-Programmierung beschrieben.
Je nach der vom Modell verwendeten EditStrategy werden die Änderungen entweder in eine Warteschlange gestellt, um später übermittelt zu werden, oder sofort übermittelt.
Sie können auch neue Daten in das Modell einfügen, indem Sie QSqlTableModel::insertRecord() aufrufen. Im folgenden Beispiel wird ein QSqlRecord mit Buchdetails gefüllt und an das Modell angehängt:
... QSqlRecord newRecord = record(); newRecord.setValue("author", "John Grisham"); newRecord.setValue("booktitle", "The Litigators"); insertRecord(rowCount(), newRecord); ...
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.