QSqlQueryModel Class

Die Klasse QSqlQueryModel bietet ein schreibgeschütztes Datenmodell für SQL-Ergebnismengen. Mehr...

Kopfzeile: #include <QSqlQueryModel>
CMake: find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake: QT += sql
Vererbt: QAbstractTableModel
Vererbt von:

QSqlTableModel

Öffentliche Funktionen

QSqlQueryModel(QObject *parent = nullptr)
virtual ~QSqlQueryModel()
virtual void clear()
QSqlError lastError() const
const QSqlQuery &query() const
QSqlRecord record(int row) const
QSqlRecord record() const
(since 6.2) void setQuery(QSqlQuery &&query)
void setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase())

Reimplementierte öffentliche Funktionen

virtual bool canFetchMore(const QModelIndex &parent = QModelIndex()) const override
virtual int columnCount(const QModelIndex &index = QModelIndex()) const override
virtual QVariant data(const QModelIndex &item, int role = Qt::DisplayRole) const override
virtual void fetchMore(const QModelIndex &parent = QModelIndex()) override
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
virtual QHash<int, QByteArray> roleNames() const override
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override
virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override

Geschützte Funktionen

virtual QModelIndex indexInQuery(const QModelIndex &item) const
virtual void queryChange()
void setLastError(const QSqlError &error)

Detaillierte Beschreibung

QSqlQueryModel ist eine High-Level-Schnittstelle für die Ausführung von SQL-Anweisungen und das Durchlaufen der Ergebnismenge. Sie baut auf der unteren Ebene QSqlQuery auf und kann verwendet werden, um Daten für Ansichtsklassen wie QTableView bereitzustellen. Ein Beispiel:

    QSqlQueryModel *model = new QSqlQueryModel;
    model->setQuery("SELECT name, salary FROM employee");
    model->setHeaderData(0, Qt::Horizontal, tr("Name"));
    model->setHeaderData(1, Qt::Horizontal, tr("Salary"));
    QTableView *view = new QTableView;
    view->setModel(model);
    view->show();

Wir stellen die Abfrage des Modells ein, dann richten wir die Beschriftungen ein, die in der Kopfzeile der Ansicht angezeigt werden.

QSqlQueryModel kann auch verwendet werden, um programmatisch auf eine Datenbank zuzugreifen, ohne sie an eine Ansicht zu binden:

    QSqlQueryModel model;
    model.setQuery("SELECT name, salary FROM employee");
    int salary = model.record(4).value("salary").toInt();

Der obige Codeschnipsel extrahiert das Feld salary aus Datensatz 4 in der Ergebnismenge der Abfrage SELECT. Da salary die 2. Spalte (oder Spaltenindex 1) ist, können wir die letzte Zeile wie folgt umschreiben:

    int salary = model.data(model.index(4, 1)).toInt();

Das Modell ist standardmäßig schreibgeschützt. Um es schreibgeschützt zu machen, müssen Sie es unterklassifizieren und setData() und flags() neu implementieren. Eine andere Möglichkeit ist die Verwendung von QSqlTableModel, die ein Schreib-Lese-Modell auf der Grundlage einer einzigen Datenbanktabelle bereitstellt.

Das querymodel Beispiel zeigt, wie man QSqlQueryModel verwendet, um das Ergebnis einer Abfrage anzuzeigen. Es zeigt auch, wie man die Unterklasse QSqlQueryModel verwendet, um den Inhalt der Daten anzupassen, bevor sie dem Benutzer angezeigt werden, und wie man ein Lese- und Schreibmodell auf der Grundlage von QSqlQueryModel erstellt.

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

Siehe auch QSqlTableModel, QSqlRelationalTableModel, QSqlQuery, Model/View Programming, und Query Model Example.

Dokumentation der Mitgliedsfunktionen

[explicit] QSqlQueryModel::QSqlQueryModel(QObject *parent = nullptr)

Erzeugt ein leeres QSqlQueryModel mit der angegebenen parent.

[virtual noexcept] QSqlQueryModel::~QSqlQueryModel()

Zerstört das Objekt und gibt alle zugewiesenen Ressourcen frei.

Siehe auch clear().

[override virtual] bool QSqlQueryModel::canFetchMore(const QModelIndex &parent = QModelIndex()) const

Reimplements: QAbstractItemModel::canFetchMore(const QModelIndex &parent) const.

Gibt true zurück, wenn es möglich ist, weitere Zeilen aus der Datenbank zu lesen. Dies betrifft nur Datenbanken, die die Größe einer Abfrage nicht zurückmelden (siehe QSqlDriver::hasFeature()).

parent sollte immer ein ungültiger QModelIndex sein.

Siehe auch fetchMore().

[virtual] void QSqlQueryModel::clear()

Löscht das Modell und gibt alle erworbenen Ressourcen frei.

[override virtual] int QSqlQueryModel::columnCount(const QModelIndex &index = QModelIndex()) const

Reimplements: QAbstractItemModel::columnCount(const QModelIndex &parent) const.

[override virtual] QVariant QSqlQueryModel::data(const QModelIndex &item, int role = Qt::DisplayRole) const

Reimplements: QAbstractItemModel::data(const QModelIndex &index, int role) const.

Gibt den Wert für die angegebenen item und role zurück.

Wenn item außerhalb der Grenzen liegt oder ein Fehler auftritt, wird ein ungültiger QVariant zurückgegeben.

Siehe auch lastError().

[override virtual] void QSqlQueryModel::fetchMore(const QModelIndex &parent = QModelIndex())

Reimplements: QAbstractItemModel::fetchMore(const QModelIndex &parent).

Holt mehr Zeilen aus einer Datenbank. Dies betrifft nur Datenbanken, die die Größe einer Abfrage nicht zurückmelden (siehe QSqlDriver::hasFeature()).

Um das Abrufen der gesamten Ergebnismenge zu erzwingen, können Sie Folgendes verwenden:

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

parent sollte immer eine ungültige QModelIndex sein.

Siehe auch canFetchMore().

[override virtual] QVariant QSqlQueryModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const

Reimplements: QAbstractItemModel::headerData(int section, Qt::Orientation orientation, int role) const.

Liefert die Kopfdaten für das angegebene role in der section des Headers mit dem angegebenen orientation.

Siehe auch setHeaderData().

[virtual protected] QModelIndex QSqlQueryModel::indexInQuery(const QModelIndex &item) const

Gibt den Index des Wertes in der Datenbankergebnismenge für die angegebene item im Modell zurück.

Der Rückgabewert ist identisch mit item, wenn keine Spalten oder Zeilen eingefügt, entfernt oder verschoben wurden.

Gibt einen ungültigen Modellindex zurück, wenn item außerhalb der Grenzen liegt oder wenn item nicht auf einen Wert in der Ergebnismenge zeigt.

Siehe auch QSqlTableModel::indexInQuery(), insertColumns(), und removeColumns().

[override virtual] bool QSqlQueryModel::insertColumns(int column, int count, const QModelIndex &parent = QModelIndex())

Reimplements: QAbstractItemModel::insertColumns(int column, int count, const QModelIndex &parent).

Fügt count Spalten an der Position column in das Modell ein. Der Parameter parent muss immer ein ungültiger QModelIndex sein, da das Modell keine Eltern-Kind-Beziehungen unterstützt.

Gibt true zurück, wenn column innerhalb der Grenzen liegt; andernfalls wird false zurückgegeben.

Standardmäßig sind die eingefügten Spalten leer. Um sie mit Daten zu füllen, reimplementieren Sie data() und behandeln jede eingefügte Spalte separat:

QVariant MyModel::data(const QModelIndex &item, int role) const
{
    if (item.column() == m_specialColumnNo) {
        // handle column separately
    }
    return QSqlQueryModel::data(item, role);
}

Siehe auch removeColumns().

QSqlError QSqlQueryModel::lastError() const

Liefert Informationen über den letzten Fehler, der in der Datenbank aufgetreten ist.

Siehe auch setLastError() und query().

const QSqlQuery &QSqlQueryModel::query() const

Gibt einen Verweis auf das mit diesem Modell verbundene Objekt const QSqlQuery zurück.

Siehe auch setQuery().

[virtual protected] void QSqlQueryModel::queryChange()

Diese virtuelle Funktion wird immer dann aufgerufen, wenn sich die Abfrage ändert. Die Standardimplementierung tut nichts.

query() gibt die neue Abfrage zurück.

Siehe auch query() und setQuery().

QSqlRecord QSqlQueryModel::record(int row) const

Gibt den Datensatz zurück, der Informationen über die Felder der aktuellen Abfrage enthält. Wenn row der Index einer gültigen Zeile ist, wird der Datensatz mit Werten aus dieser Zeile gefüllt.

Wenn das Modell nicht initialisiert ist, wird ein leerer Datensatz zurückgegeben.

Siehe auch QSqlRecord::isEmpty().

QSqlRecord QSqlQueryModel::record() const

Dies ist eine überladene Funktion.

Gibt einen leeren Datensatz zurück, der Informationen über die Felder der aktuellen Abfrage enthält.

Wenn das Modell nicht initialisiert ist, wird ein leerer Datensatz zurückgegeben.

Siehe auch QSqlRecord::isEmpty().

[override virtual] bool QSqlQueryModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())

Reimplements: QAbstractItemModel::removeColumns(int column, int count, const QModelIndex &parent).

Entfernt count Spalten aus dem Modell ab der Position column. Der Parameter parent muss immer ein ungültiger QModelIndex sein, da das Modell keine Eltern-Kind-Beziehungen unterstützt.

Das Entfernen von Spalten blendet diese effektiv aus. Die zugrunde liegende QSqlQuery bleibt davon unberührt.

Gibt true zurück, wenn die Spalten entfernt wurden; andernfalls wird false zurückgegeben.

[override virtual] QHash<int, QByteArray> QSqlQueryModel::roleNames() const

Reimplements: QAbstractItemModel::roleNames() const.

Gibt die Rollennamen des Modells zurück.

Qt definiert nur eine Rolle für die QSqlQueryModel:

Qt-RolleQML-Rollen-Name
Qt::DisplayRoleanzeigen

[override virtual] int QSqlQueryModel::rowCount(const QModelIndex &parent = QModelIndex()) const

Reimplements: QAbstractItemModel::rowCount(const QModelIndex &parent) const.

Wenn die Datenbank die Rückgabe der Größe einer Abfrage unterstützt (siehe QSqlDriver::hasFeature()), wird die Anzahl der Zeilen der aktuellen Abfrage zurückgegeben. Andernfalls wird die Anzahl der aktuell auf dem Client zwischengespeicherten Zeilen zurückgegeben.

parent sollte immer ein ungültiges QModelIndex sein.

Siehe auch canFetchMore() und QSqlDriver::hasFeature().

[override virtual] bool QSqlQueryModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole)

Reimplements: QAbstractItemModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role).

Setzt die Beschriftung für eine horizontale Kopfzeile für die angegebene role auf value. Dies ist nützlich, wenn das Modell zur Anzeige von Daten in einer Ansicht verwendet wird (z.B. QTableView).

Gibt true zurück, wenn orientation Qt::Horizontal ist und sich section auf einen gültigen Abschnitt bezieht; andernfalls wird false zurückgegeben.

Beachten Sie, dass diese Funktion nicht verwendet werden kann, um Werte in der Datenbank zu ändern, da das Modell schreibgeschützt ist.

Siehe auch headerData() und data().

[protected] void QSqlQueryModel::setLastError(const QSqlError &error)

Geschützte Funktion, die es abgeleiteten Klassen ermöglicht, den Wert des letzten Fehlers, der in der Datenbank aufgetreten ist, auf error zu setzen.

Siehe auch lastError().

[since 6.2] void QSqlQueryModel::setQuery(QSqlQuery &&query)

Setzt das Modell zurück und setzt den Datenanbieter auf den angegebenen query. Beachten Sie, dass die Abfrage aktiv sein muss und nicht isForwardOnly() sein darf.

lastError() kann verwendet werden, um ausführliche Informationen abzurufen, wenn ein Fehler beim Setzen der Abfrage aufgetreten ist.

Hinweis: Der Aufruf von setQuery() entfernt alle eingefügten Spalten.

Diese Funktion wurde in Qt 6.2 eingeführt.

Siehe auch query(), QSqlQuery::isActive(), QSqlQuery::setForwardOnly(), und lastError().

void QSqlQueryModel::setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase())

Dies ist eine überladene Funktion.

Führt die Abfrage query für die angegebene Datenbankverbindung db aus. Wenn keine Datenbank (oder eine ungültige Datenbank) angegeben wird, wird die Standardverbindung verwendet.

lastError() kann verwendet werden, um ausführliche Informationen abzurufen, wenn beim Setzen der Abfrage ein Fehler aufgetreten ist.

Beispiel:

QSqlQueryModel model; model.setQuery("select * from MyTable");if (model.lastError().isValid())    qDebug() << model.lastError();

Siehe auch query(), queryChange(), und lastError().

© 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.