QSqlRelationalTableModel Class

Die Klasse QSqlRelationalTableModel bietet ein editierbares Datenmodell für eine einzelne Datenbanktabelle mit Fremdschlüsselunterstützung. Mehr...

Kopfzeile: #include <QSqlRelationalTableModel>
CMake: find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake: QT += sql
Vererbungen: QSqlTableModel

Öffentliche Typen

enum JoinMode { InnerJoin, LeftJoin }

Öffentliche Funktionen

QSqlRelationalTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())
virtual ~QSqlRelationalTableModel()
QSqlRelation relation(int column) const
virtual QSqlTableModel *relationModel(int column) const
void setJoinMode(QSqlRelationalTableModel::JoinMode joinMode)
virtual void setRelation(int column, const QSqlRelation &relation)

Reimplementierte öffentliche Funktionen

virtual void clear() override
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
virtual bool select() override
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override
virtual void setTable(const QString &table) override

Öffentliche Slots

virtual void revertRow(int row) override

Reimplementierte geschützte Funktionen

virtual bool insertRowIntoTable(const QSqlRecord &values) override
virtual QString orderByClause() const override
virtual QString selectStatement() const override
virtual bool updateRowInTable(int row, const QSqlRecord &values) override

Detaillierte Beschreibung

QSqlRelationalTableModel verhält sich wie QSqlTableModel, erlaubt aber das Setzen von Spalten als Fremdschlüssel in andere Datenbanktabellen.

Der Screenshot auf der linken Seite zeigt eine einfache QSqlTableModel in einer QTableView. Fremdschlüssel (city und country) werden nicht in menschenlesbare Werte aufgelöst. Der Screenshot auf der rechten Seite zeigt ein QSqlRelationalTableModel, bei dem die Fremdschlüssel in menschenlesbare Textstrings aufgelöst wurden.

Der folgende Codeschnipsel zeigt, wie das QSqlRelationalTableModel eingerichtet wurde:

    model->setTable("employee");

    model->setRelation(2, QSqlRelation("city", "id", "name"));
    model->setRelation(3, QSqlRelation("country", "id", "name"));

Die Funktionsaufrufe setRelation() stellen eine Beziehung zwischen zwei Tabellen her. Der erste Aufruf legt fest, dass Spalte 2 in der Tabelle employee ein Fremdschlüssel ist, der dem Feld id der Tabelle city zugeordnet ist, und dass die Ansicht dem Benutzer das Feld name von city präsentieren soll. Der zweite Aufruf macht etwas Ähnliches mit Spalte 3.

Wenn Sie ein QSqlRelationalTableModel zum Lesen und Schreiben verwenden, wollen Sie wahrscheinlich QSqlRelationalDelegate für den View verwenden. Im Gegensatz zum Standarddelegaten bietet QSqlRelationalDelegate eine Combobox für Felder, die Fremdschlüssel zu anderen Tabellen sind. Um die Klasse zu verwenden, rufen Sie einfach QAbstractItemView::setItemDelegate() auf dem View mit einer Instanz von QSqlRelationalDelegate auf:

    std::unique_ptr<QTableView> view{new QTableView};
    view->setModel(model);
    view->setItemDelegate(new QSqlRelationalDelegate(view.get()));

Das Beispiel relationaltablemodel zeigt, wie man QSqlRelationalTableModel in Verbindung mit QSqlRelationalDelegate verwendet, um Tabellen mit Fremdschlüsselunterstützung bereitzustellen.

Hinweise:

  • Die Tabelle muss einen deklarierten Primärschlüssel haben.
  • Der Primärschlüssel der Tabelle darf keine Beziehung zu einer anderen Tabelle enthalten.
  • Wenn eine relationale Tabelle Schlüssel enthält, die sich auf nicht existierende Zeilen in der referenzierten Tabelle beziehen, werden die Zeilen, die die ungültigen Schlüssel enthalten, nicht durch das Modell dargestellt. Der Benutzer oder die Datenbank ist für die Wahrung der referentiellen Integrität verantwortlich.
  • Wenn der Name der Anzeigespalte einer Relation auch als Spaltenname in der relationalen Tabelle verwendet wird, oder wenn er als Anzeigespaltenname in mehr als einer Relation verwendet wird, wird er mit einem Alias versehen. Der Alias besteht aus dem Tabellennamen der Beziehung, dem Namen der Anzeigespalte und einer eindeutigen ID, die durch einen Unterstrich verbunden ist (z. B. tablename_columnname_id). QSqlRecord::fieldName() gibt den aliasierten Spaltennamen zurück. Alle Vorkommen des doppelten Anzeigespaltennamens werden aliasiert, wenn die Duplizierung erkannt wird, aber es wird kein Aliasing an den Spaltennamen in der Haupttabelle vorgenommen. Das Alias wirkt sich nicht auf QSqlRelation aus, so dass QSqlRelation::displayColumn() den ursprünglichen Anzeigespaltennamen zurückgibt.
  • Der Name der Referenztabelle wird mit einem Alias versehen. Der Alias besteht aus dem Wort "relTblAl" und dem Index der Referenzspalte, verbunden durch einen Unterstrich (z. B. relTblAl_2). Der Alias kann zum Filtern der Tabelle verwendet werden (z. B. setFilter("relTblAl_2='Oslo' OR relTblAl_3='USA'")).
  • Bei der Verwendung von setData() sollte die Rolle immer Qt::EditRole sein, und bei der Verwendung von data() sollte die Rolle immer Qt::DisplayRole sein.

Siehe auch QSqlRelation, QSqlRelationalDelegate, und Relationales Tabellenmodell Beispiel.

Dokumentation der Mitgliedstypen

enum QSqlRelationalTableModel::JoinMode

KonstanteWertBeschreibung
QSqlRelationalTableModel::InnerJoin0- Inner join mode, gibt Zeilen zurück, wenn es mindestens eine Übereinstimmung in beiden Tabellen gibt.
QSqlRelationalTableModel::LeftJoin1- Left join mode, gibt alle Zeilen aus der linken Tabelle (table_name1) zurück, auch wenn es keine Übereinstimmungen in der rechten Tabelle (table_name2) gibt.

Siehe auch QSqlRelationalTableModel::setJoinMode().

Dokumentation der Mitgliedsfunktionen

[explicit] QSqlRelationalTableModel::QSqlRelationalTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())

Erstellt ein leeres QSqlRelationalTableModel und setzt das Parent auf parent und die Datenbankverbindung auf db. Wenn db nicht gültig ist, wird die Standard-Datenbankverbindung verwendet.

[virtual noexcept] QSqlRelationalTableModel::~QSqlRelationalTableModel()

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

[override virtual] void QSqlRelationalTableModel::clear()

Reimplements: QSqlTableModel::clear().

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

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

Siehe auch setData().

[override virtual protected] bool QSqlRelationalTableModel::insertRowIntoTable(const QSqlRecord &values)

Reimplements: QSqlTableModel::insertRowIntoTable(const QSqlRecord &values).

[override virtual protected] QString QSqlRelationalTableModel::orderByClause() const

Reimplements: QSqlTableModel::orderByClause() const.

QSqlRelation QSqlRelationalTableModel::relation(int column) const

Liefert die Relation für die Spalte column, oder eine ungültige Relation, wenn keine Relation gesetzt ist.

Siehe auch setRelation() und QSqlRelation::isValid().

[virtual] QSqlTableModel *QSqlRelationalTableModel::relationModel(int column) const

Gibt ein Objekt QSqlTableModel für den Zugriff auf die Tabelle zurück, für die column ein Fremdschlüssel ist, oder nullptr, wenn es keine Beziehung für die angegebene column gibt.

Das zurückgegebene Objekt gehört der QSqlRelationalTableModel.

Siehe auch setRelation() und relation().

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

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

[override virtual slot] void QSqlRelationalTableModel::revertRow(int row)

Reimplements: QSqlTableModel::revertRow(int row).

[override virtual] bool QSqlRelationalTableModel::select()

Reimplements: QSqlTableModel::select().

[override virtual protected] QString QSqlRelationalTableModel::selectStatement() const

Reimplements: QSqlTableModel::selectStatement() const.

[override virtual] bool QSqlRelationalTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)

Reimplements: QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role).

Setzt die Daten für role in dem Element mit dem angegebenen index auf den angegebenen value. Abhängig von der Bearbeitungsstrategie kann der Wert sofort in die Datenbank übernommen oder im Modell zwischengespeichert werden.

Gibt true zurück, wenn der Wert gesetzt werden konnte, oder false im Fehlerfall (z. B. wenn index außerhalb des zulässigen Bereichs liegt).

Bei relationalen Spalten muss value der Index sein, nicht der Anzeigewert. Der Index muss auch in der referenzierten Tabelle existieren, andernfalls gibt die Funktion false zurück.

Siehe auch editStrategy(), data(), submit(), und revertRow().

void QSqlRelationalTableModel::setJoinMode(QSqlRelationalTableModel::JoinMode joinMode)

Legt fest, dass der SQL joinMode Zeilen mit NULL-Fremdschlüsseln anzeigt oder ausblendet. Im Modus InnerJoin (Standard) werden diese Zeilen nicht angezeigt: Verwenden Sie den Modus LeftJoin, wenn Sie sie anzeigen möchten.

Siehe auch QSqlRelationalTableModel::JoinMode.

[virtual] void QSqlRelationalTableModel::setRelation(int column, const QSqlRelation &relation)

Lässt den angegebenen column ein durch relation spezifizierter Fremdindex sein.

Beispiel:

    model->setTable("employee");

    model->setRelation(2, QSqlRelation("city", "id", "name"));

Der setRelation()-Aufruf gibt an, dass Spalte 2 in der Tabelle employee ein Fremdschlüssel ist, der dem Feld id der Tabelle city zugeordnet ist, und dass der View dem Benutzer das Feld name von city präsentieren soll.

Hinweis: Der Primärschlüssel der Tabelle darf keine Beziehung zu einer anderen Tabelle enthalten.

Siehe auch relation().

[override virtual] void QSqlRelationalTableModel::setTable(const QString &table)

Reimplements: QSqlTableModel::setTable(const QString &tableName).

[override virtual protected] bool QSqlRelationalTableModel::updateRowInTable(int row, const QSqlRecord &values)

Reimplements: QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values).

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