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 |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QSqlRelationalTableModel ist Teil von Database Classes.
Ö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
Konstante | Wert | Beschreibung |
---|---|---|
QSqlRelationalTableModel::InnerJoin | 0 | - Inner join mode, gibt Zeilen zurück, wenn es mindestens eine Übereinstimmung in beiden Tabellen gibt. |
QSqlRelationalTableModel::LeftJoin | 1 | - 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.