QSqlRelationalTableModel Class
Die Klasse „QSqlRelationalTableModel“ bietet ein bearbeitbares Datenmodell für eine einzelne Datenbanktabelle mit Unterstützung für Fremdschlüssel. Mehr...
| Überschrift: | #include <QSqlRelationalTableModel> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Sql) target_link_libraries(mytarget PRIVATE Qt6::Sql) |
| qmake: | QT += sql |
| Erbt von: | QSqlTableModel |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QSqlRelationalTableModel ist Teil der Datenbankklassen.
Ö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) |
Neu implementierte ö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 |
Neu implementierte 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 |
Ausführliche Beschreibung
QSqlRelationalTableModel verhält sich wie „ QSqlTableModel “, ermöglicht es jedoch, Spalten als Fremdschlüssel in andere Datenbanktabellen festzulegen.
![]() | ![]() |
Der Screenshot auf der linken Seite zeigt ein einfaches ` QSqlTableModel ` in einem ` QTableView`. Fremdschlüssel (`city ` und ` country`) werden nicht in für Menschen lesbare Werte aufgelöst. Der Screenshot auf der rechten Seite zeigt ein `QSqlRelationalTableModel`, bei dem Fremdschlüssel in für Menschen lesbare Textzeichenfolgen aufgelöst wurden.
Der folgende Codeausschnitt zeigt, wie das QSqlRelationalTableModel eingerichtet wurde:
model->setTable("employee");
model->setRelation(2, QSqlRelation("city", "id", "name"));
model->setRelation(3, QSqlRelation("country", "id", "name"));Die Aufrufe der Funktion ` 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 das Feld „ name “ der Tabelle „ city “ dem Benutzer anzeigen soll. Der zweite Aufruf führt etwas Ähnliches für Spalte 3 durch.
Wenn Sie ein schreib- und lesbares `QSqlRelationalTableModel` verwenden, möchten Sie wahrscheinlich ` QSqlRelationalDelegate ` für die Ansicht einsetzen. Im Gegensatz zum Standard-Delegaten stellt ` QSqlRelationalDelegate ` eine Combobox für Felder bereit, die Fremdschlüssel in andere Tabellen sind. Um die Klasse zu verwenden, rufen Sie einfach ` QAbstractItemView::setItemDelegate()` für die Ansicht 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“ veranschaulicht, wie man QSqlRelationalTableModel in Verbindung mit „ QSqlRelationalDelegate “ einsetzt, um Tabellen mit Fremdschlüsselunterstützung auszustatten.

Hinweise:
- Für die Tabelle muss ein Primärschlüssel deklariert sein.
- Der Primärschlüssel der Tabelle darf keine Referenz auf eine andere Tabelle enthalten.
- Wenn eine relationale Tabelle Schlüssel enthält, die auf nicht vorhandene Zeilen in der referenzierten Tabelle verweisen, werden die Zeilen mit den ungültigen Schlüsseln über das Modell nicht bereitgestellt. Der Benutzer oder die Datenbank ist für die Wahrung der referenziellen Integrität verantwortlich.
- Wenn der Anzeigename einer Spalte in einer Beziehung ebenfalls als Spaltenname in der relationalen Tabelle verwendet wird oder wenn er als Anzeigename in mehr als einer Beziehung verwendet wird, wird er mit einem Alias versehen. Der Alias setzt sich aus dem Tabellennamen der Relation, dem Anzeigenamen der Spalte und einer eindeutigen ID zusammen, die durch einen Unterstrich verbunden sind (z. B. tablename_columnname_id). Die Funktion ` QSqlRecord::fieldName()` gibt den Spaltennamen mit Alias zurück. Alle Vorkommen des doppelten Anzeigespaltennamens erhalten bei Feststellung einer Duplizierung einen Alias, während für die Spaltennamen in der Haupttabelle kein Aliasing erfolgt. Das Aliasing hat keinen Einfluss auf ` QSqlRelation`, sodass ` QSqlRelation::displayColumn()` den ursprünglichen Anzeigespaltennamen zurückgibt.
- Der Name der Referenztabelle erhält einen Alias. Der Alias besteht aus dem Wort „relTblAl“ und dem Index der zugehörigen Spalte, 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 Verwendung von ` setData()` sollte die Rolle immer ` Qt::EditRole` lauten, und bei Verwendung von ` data()` sollte die Rolle immer ` Qt::DisplayRole` lauten.
Siehe auch „ QSqlRelation“ , „ QSqlRelationalDelegate “ und „Beispiel für ein relationales Tabellenmodell“.
Dokumentation zum Mitgliedstyp
enum QSqlRelationalTableModel::JoinMode
| Konstante | Wert | Beschreibung |
|---|---|---|
QSqlRelationalTableModel::InnerJoin | 0 | - Inner-Join-Modus: Es werden Zeilen zurückgegeben, wenn in beiden Tabellen mindestens eine Übereinstimmung vorliegt. |
QSqlRelationalTableModel::LeftJoin | 1 | - „Left Join“-Modus: Gibt alle Zeilen aus der linken Tabelle (table_name1) zurück, auch wenn in der rechten Tabelle (table_name2) keine Übereinstimmungen vorhanden sind. |
Siehe auch ` QSqlRelationalTableModel::setJoinMode()`.
Dokumentation zu Mitgliedsfunktionen
[explicit] QSqlRelationalTableModel::QSqlRelationalTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())
Erstellt ein leeres „QSqlRelationalTableModel“, legt „ parent “ als übergeordnetes Element fest und stellt die Datenbankverbindung auf „ db “ ein. Falls „ db “ ungültig ist, wird die Standard-Datenbankverbindung verwendet.
[virtual noexcept] QSqlRelationalTableModel::~QSqlRelationalTableModel()
Löscht das Objekt und gibt alle zugewiesenen Ressourcen frei.
[override virtual] void QSqlRelationalTableModel::clear()
Implementiert: QSqlTableModel::clear().
[override virtual] QVariant QSqlRelationalTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
Implementiert neu: ` QSqlTableModel::data(const QModelIndex &index, int role) const`.
Siehe auch setData().
[override virtual protected] bool QSqlRelationalTableModel::insertRowIntoTable(const QSqlRecord &values)
Implementiert: ` QSqlTableModel::insertRowIntoTable(const QSqlRecord &values)`.
[override virtual protected] QString QSqlRelationalTableModel::orderByClause() const
Implementiert: ` QSqlTableModel::orderByClause()` const.
QSqlRelation QSqlRelationalTableModel::relation(int column) const
Gibt die Relation für die Spalte „ column “ zurück oder eine ungültige Relation, wenn keine Relation festgelegt ist.
Siehe auch ` setRelation()` und ` QSqlRelation::isValid()`.
[virtual] QSqlTableModel *QSqlRelationalTableModel::relationModel(int column) const
Gibt ein ` QSqlTableModel `-Objekt zurück, um auf die Tabelle zuzugreifen, für die ` column ` ein Fremdschlüssel ist, oder ` nullptr `, wenn für die angegebene ` column` keine Beziehung besteht.
Das zurückgegebene Objekt gehört dem ` QSqlRelationalTableModel`.
Siehe auch setRelation() und relation().
[override virtual] bool QSqlRelationalTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
Implementiert: ` QSqlTableModel::removeColumns` (int column, int count, const QModelIndex &parent).
[override virtual slot] void QSqlRelationalTableModel::revertRow(int row)
Implementiert: QSqlTableModel::revertRow(int row).
[override virtual] bool QSqlRelationalTableModel::select()
Implementiert: QSqlTableModel::select().
[override virtual protected] QString QSqlRelationalTableModel::selectStatement() const
Implementiert neu: ` QSqlTableModel::selectStatement()` const.
[override virtual] bool QSqlRelationalTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
Implementiert: ` QSqlTableModel::setData` (const QModelIndex &index, const QVariant &value, int role).
Setzt die Daten für das „ role “ im Element mit dem angegebenen „ index “ auf den angegebenen „ value “. Je nach Bearbeitungsstrategie wird der Wert möglicherweise sofort in die Datenbank übernommen oder im Modell zwischengespeichert.
Gibt „ true “ zurück, wenn der Wert gesetzt werden konnte, oder „false“ bei einem Fehler (z. B. wenn „ index “ außerhalb des zulässigen Bereichs liegt).
Bei relationalen Spalten muss value der Index sein, nicht der Anzeigewert. Wenn ein Index angegeben wird, muss dieser auch in der referenzierten Tabelle vorhanden sein, andernfalls gibt die Funktion false zurück. Wird anstelle eines Indexes ein QVariant() übergeben, wird der Index gelöscht.
Siehe auch editStrategy(), data(), submit() und revertRow().
void QSqlRelationalTableModel::setJoinMode(QSqlRelationalTableModel::JoinMode joinMode)
Legt die SQL- joinMode fest, um Zeilen mit NULL-Fremdschlüsseln anzuzeigen oder auszublenden. 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)
Angenommen, der angegebene ` column ` ist ein Fremdindex, der durch ` relation` definiert ist.
Beispiel:
model->setTable("employee");
model->setRelation(2, QSqlRelation("city", "id", "name"));Der Aufruf von `setRelation()` 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 ` der Tabelle ` city` anzeigen 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)
Implementiert neu: ` QSqlTableModel::setTable(const QString &tableName)`.
[override virtual protected] bool QSqlRelationalTableModel::updateRowInTable(int row, const QSqlRecord &values)
Implementiert: QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values).
© 2026 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.

