Präsentieren von Daten in einer Tabellenansicht

Die Klassen QSqlQueryModel, QSqlTableModel und QSqlRelationalTableModel können als Datenquelle für die Qt-Ansichtsklassen wie QListView, QTableView und QTreeView verwendet werden. In der Praxis ist QTableView bei weitem die häufigste Wahl, da eine SQL-Ergebnismenge im Wesentlichen eine zweidimensionale Datenstruktur ist.

A table view displaying a QSqlTableModel

Das folgende Beispiel erstellt einen View auf der Grundlage eines SQL-Datenmodells:

    QTableView *view = new QTableView;
    view->setModel(model);
    view->show();

Handelt es sich bei dem Modell um ein Schreib-Lese-Modell (z. B. QSqlTableModel), lässt der View den Benutzer die Felder bearbeiten. Sie können dies deaktivieren, indem Sie

    view->setEditTriggers(QAbstractItemView::NoEditTriggers);

Sie können das gleiche Modell als Datenquelle für mehrere Ansichten verwenden. Wenn der Benutzer das Modell über eine der Ansichten bearbeitet, spiegeln die anderen Ansichten die Änderungen sofort wider. Das Beispiel des Tabellenmodells zeigt, wie das funktioniert.

View-Klassen zeigen oben eine Kopfzeile an, um die Spalten zu beschriften. Um die Texte der Kopfzeile zu ändern, rufen Sie setHeaderData() auf dem Modell auf. Die Beschriftungen der Kopfzeile entsprechen standardmäßig den Feldnamen der Tabelle. Zum Beispiel:

    model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
    model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));
    model->setHeaderData(2, Qt::Horizontal, QObject::tr("City"));
    model->setHeaderData(3, Qt::Horizontal, QObject::tr("Country"));

QTableView Das Modell hat auch eine vertikale Überschrift auf der linken Seite mit Zahlen zur Identifizierung der Zeilen. Wenn Sie Zeilen programmatisch mit QSqlTableModel::insertRows() einfügen, werden die neuen Zeilen mit einem Sternchen (*) gekennzeichnet, bis sie mit submitAll() übermittelt werden oder automatisch, wenn der Benutzer zu einem anderen Datensatz wechselt (vorausgesetzt, edit strategy ist QSqlTableModel::OnRowChange).

Inserting a row in a model

Wenn Sie Zeilen mit removeRows() entfernen, werden die Zeilen mit einem Ausrufezeichen (!) gekennzeichnet, bis die Änderung übermittelt wird.

Die Elemente in der Ansicht werden mithilfe eines Delegaten gerendert. Der Standarddelegat QStyledItemDelegate verarbeitet die gängigsten Datentypen (int, QString, QImage, etc.). Der Delegat ist auch für die Bereitstellung von Editor-Widgets (z. B. eine Combobox) verantwortlich, wenn der Benutzer mit der Bearbeitung eines Elements in der Ansicht beginnt. Sie können Ihre eigenen Delegaten erstellen, indem Sie QAbstractItemDelegate oder QStyledItemDelegate subclassing. Siehe Model/View-Programmierung für weitere Informationen.

QSqlTableModel ist dafür optimiert, jeweils nur eine Tabelle zu bearbeiten. Wenn Sie ein Modell zum Lesen und Schreiben benötigen, das auf einer beliebigen Ergebnismenge arbeitet, können Sie QSqlQueryModel unterklassifizieren und flags() und setData() neu implementieren, um es zum Lesen und Schreiben zu machen. Die folgenden zwei Funktionen machen die Felder 1 und 2 eines Abfragemodells editierbar:

Qt::ItemFlags EditableSqlModel::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = QSqlQueryModel::flags(index);
    if (index.column() == 1 || index.column() == 2)
        flags |= Qt::ItemIsEditable;
    return flags;
}

bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int /* role */)
{
    if (index.column() < 1 || index.column() > 2)
        return false;

    QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
    int id = data(primaryKeyIndex).toInt();

    clear();

    bool ok;
    if (index.column() == 1)
        ok = setFirstName(id, value.toString());
    else
        ok = setLastName(id, value.toString());
    refresh();
    return ok;
}

Die Hilfsfunktion setFirstName() ist wie folgt definiert:

bool EditableSqlModel::setFirstName(int personId, const QString &firstName)
{
    QSqlQuery query;
    query.prepare("update person set firstname = ? where id = ?");
    query.addBindValue(firstName);
    query.addBindValue(personId);
    return query.exec();
}

Die Funktion setLastName() ist ähnlich. Siehe das Query Model Beispiel für den kompletten Quellcode.

Die Unterklassifizierung eines Modells ermöglicht es, es auf viele Arten anzupassen: Sie können Tooltips für die Elemente bereitstellen, die Hintergrundfarbe ändern, berechnete Werte bereitstellen, unterschiedliche Werte für die Anzeige und Bearbeitung bereitstellen, Nullwerte speziell behandeln und vieles mehr. Einzelheiten finden Sie in der Modell-/Ansichtsprogrammierung und in der Referenzdokumentation QAbstractItemView.

Wenn Sie lediglich einen Fremdschlüssel in eine menschenfreundlichere Zeichenkette auflösen müssen, können Sie QSqlRelationalTableModel verwenden. Um optimale Ergebnisse zu erzielen, sollten Sie auch QSqlRelationalDelegate verwenden, einen Delegaten, der Combobox-Editoren für die Bearbeitung von Fremdschlüsseln bereitstellt.

Editing a foreign key in a relational table

Das Beispiel des relationalen Tabellenmodells veranschaulicht, wie Sie QSqlRelationalTableModel in Verbindung mit QSqlRelationalDelegate verwenden, um Tabellen mit Fremdschlüsselunterstützung bereitzustellen.

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