QSqlRelationalTableModel Class
La classe `QSqlRelationalTableModel` fournit un modèle de données modifiable pour une seule table de base de données, avec prise en charge des clés étrangères. En savoir plus...
| En-tête : | #include <QSqlRelationalTableModel> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Sql) target_link_libraries(mytarget PRIVATE Qt6::Sql) |
| qmake : | QT += sql |
| Hérite de : | QSqlTableModel |
- Liste de tous les membres, y compris les membres hérités
- QSqlRelationalTableModel fait partie des classes de base de données.
Types publics
| enum | JoinMode { InnerJoin, LeftJoin } |
Fonctions publiques
| 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) |
Fonctions publiques réimplémentées
| 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 |
Slots publics
| virtual void | revertRow(int row) override |
Fonctions protégées réimplémentées
| 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 |
Description détaillée
QSqlRelationalTableModel se comporte comme QSqlTableModel, mais permet de définir des colonnes comme clés étrangères vers d'autres tables de la base de données.
![]() | ![]() |
La capture d’écran de gauche montre un simple QSqlTableModel dans un QTableView. Les clés étrangères (city et country) ne sont pas converties en valeurs lisibles par l’utilisateur. La capture d’écran de droite montre un QSqlRelationalTableModel, avec les clés étrangères converties en chaînes de caractères lisibles par l’utilisateur.
L'extrait de code suivant montre comment le QSqlRelationalTableModel a été configuré :
model->setTable("employee");
model->setRelation(2, QSqlRelation("city", "id", "name"));
model->setRelation(3, QSqlRelation("country", "id", "name"));Les appels à la fonction ` setRelation()` établissent une relation entre deux tables. Le premier appel spécifie que la colonne 2 de la table ` employee ` est une clé étrangère qui correspond au champ ` id ` de la table ` city`, et que la vue doit présenter à l’utilisateur le champ ` name ` de la table ` city`. Le deuxième appel effectue une opération similaire avec la colonne 3.
Si vous utilisez un QSqlRelationalTableModel en lecture-écriture, vous souhaiterez probablement utiliser QSqlRelationalDelegate sur la vue. Contrairement au délégué par défaut, QSqlRelationalDelegate fournit une liste déroulante pour les champs qui sont des clés étrangères vers d’autres tables. Pour utiliser cette classe, il suffit d’appeler QAbstractItemView::setItemDelegate() sur la vue avec une instance de QSqlRelationalDelegate:
std::unique_ptr<QTableView> view{new QTableView};
view->setModel(model);
view->setItemDelegate(new QSqlRelationalDelegate(view.get()));L'exemple `relationaltablemodel ` illustre comment utiliser `QSqlRelationalTableModel` en conjonction avec ` QSqlRelationalDelegate ` pour doter les tables d'une prise en charge des clés étrangères.

Remarques :
- La table doit disposer d’une clé primaire déclarée.
- La clé primaire de la table ne doit pas contenir de référence à une autre table.
- Si une table relationnelle contient des clés faisant référence à des lignes inexistantes dans la table référencée, les lignes contenant ces clés invalides ne seront pas exposées via le modèle. Il incombe à l'utilisateur ou à la base de données de garantir l'intégrité référentielle.
- Si le nom de colonne d'affichage d'une relation est également utilisé comme nom de colonne dans la table relationnelle, ou s'il est utilisé comme nom de colonne d'affichage dans plusieurs relations, il sera aliasé. L'alias est constitué du nom de la table de la relation, du nom de la colonne d’affichage et d’un identifiant unique, reliés par un trait de soulignement (par exemple : nom_table_nom_colonne_id). La fonction ` QSqlRecord::fieldName()` renvoie le nom de la colonne aliasée. Toutes les occurrences du nom de colonne d’affichage en double sont aliasées lorsque la duplication est détectée, mais aucun alias n’est attribué aux noms de colonnes de la table principale. L’aliasing n’affecte pas la fonction ` QSqlRelation`, de sorte que ` QSqlRelation::displayColumn()` renverra le nom de colonne d’affichage d’origine.
- Le nom de la table de référence est aliasé. L’alias est constitué du mot « relTblAl » suivi de l’index de la colonne associée, séparés par un trait de soulignement (par exemple, relTblAl_2). L'alias peut être utilisé pour filtrer la table (par exemple, setFilter("relTblAl_2='Oslo' OR relTblAl_3='USA'")).
- Lorsque vous utilisez setData(), le rôle doit toujours être Qt::EditRole, et lorsque vous utilisez data(), le rôle doit toujours être Qt::DisplayRole.
Voir également QSqlRelation, QSqlRelationalDelegate et Exemple de modèle de table relationnelle.
Documentation sur les types de membres
enum QSqlRelationalTableModel::JoinMode
| Constante | Valeur | Description |
|---|---|---|
QSqlRelationalTableModel::InnerJoin | 0 | - Mode de jointure interne : renvoie les lignes lorsqu'il existe au moins une correspondance dans les deux tables. |
QSqlRelationalTableModel::LeftJoin | 1 | - Mode de jointure gauche : renvoie toutes les lignes de la table de gauche (table_name1), même s'il n'y a pas de correspondances dans la table de droite (table_name2). |
Voir aussi QSqlRelationalTableModel::setJoinMode().
Documentation des fonctions membres
[explicit] QSqlRelationalTableModel::QSqlRelationalTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())
Crée un objet QSqlRelationalTableModel vide, définit son parent sur parent et sa connexion à la base de données sur db. Si l'adresse db n'est pas valide, la connexion par défaut à la base de données sera utilisée.
[virtual noexcept] QSqlRelationalTableModel::~QSqlRelationalTableModel()
Détruit l'objet et libère toutes les ressources allouées.
[override virtual] void QSqlRelationalTableModel::clear()
Réimplémente : QSqlTableModel::clear().
[override virtual] QVariant QSqlRelationalTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
Réimplémente : QSqlTableModel::data(const QModelIndex &index, int role) const.
Voir aussi setData().
[override virtual protected] bool QSqlRelationalTableModel::insertRowIntoTable(const QSqlRecord &values)
Réimplémente : QSqlTableModel::insertRowIntoTable(const QSqlRecord &values).
[override virtual protected] QString QSqlRelationalTableModel::orderByClause() const
Réimplémente : QSqlTableModel::orderByClause() const.
QSqlRelation QSqlRelationalTableModel::relation(int column) const
Renvoie la relation associée à la colonne « column », ou une relation non valide si aucune relation n'est définie.
Voir également setRelation() et QSqlRelation::isValid().
[virtual] QSqlTableModel *QSqlRelationalTableModel::relationModel(int column) const
Renvoie un objet ` QSqlTableModel ` permettant d'accéder à la table pour laquelle ` column ` est une clé étrangère, ou ` nullptr ` s'il n'existe aucune relation pour la clé étrangère donnée ` column`.
L'objet renvoyé appartient à QSqlRelationalTableModel.
Voir également setRelation() et relation().
[override virtual] bool QSqlRelationalTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
Réimplémente : QSqlTableModel::removeColumns(int column, int count, const QModelIndex &parent).
[override virtual slot] void QSqlRelationalTableModel::revertRow(int row)
Réimplémente : QSqlTableModel::revertRow(int row).
[override virtual] bool QSqlRelationalTableModel::select()
Réimplémentation de : QSqlTableModel::select().
[override virtual protected] QString QSqlRelationalTableModel::selectStatement() const
Réimplémente : QSqlTableModel::selectStatement() const.
[override virtual] bool QSqlRelationalTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
Réimplémente : QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role).
Définit la valeur de l'role dans l'élément dont l'index est spécifiée, en lui attribuant la value indiquée. Selon la stratégie d'édition, la valeur peut être appliquée immédiatement à la base de données ou mise en cache dans le modèle.
Renvoie ` true ` si la valeur a pu être définie, ou `false` en cas d’erreur (par exemple, si ` index ` est hors limites).
Pour les colonnes relationnelles, value doit correspondre à l’index, et non à la valeur d’affichage. Si un index est fourni, il doit également exister dans la table référencée, sinon la fonction renvoie false. Si un QVariant() est transmis à la place d’un index, l’index est effacé.
Voir également editStrategy(), data(), submit() et revertRow().
void QSqlRelationalTableModel::setJoinMode(QSqlRelationalTableModel::JoinMode joinMode)
Définit l'joinMode SQL permettant d'afficher ou de masquer les lignes dont les clés étrangères sont NULL. En mode « InnerJoin » (par défaut), ces lignes ne seront pas affichées : utilisez le mode « LeftJoin » si vous souhaitez les afficher.
Voir également QSqlRelationalTableModel::JoinMode.
[virtual] void QSqlRelationalTableModel::setRelation(int column, const QSqlRelation &relation)
Supposons que l'column spécifiée soit un index externe défini par relation.
Exemple :
model->setTable("employee");
model->setRelation(2, QSqlRelation("city", "id", "name"));L'appel à setRelation() spécifie que la colonne 2 de la table employee est une clé étrangère qui correspond au champ id de la table city, et que la vue doit présenter à l'utilisateur le champ name de la table city.
Remarque : la clé primaire de la table ne peut pas contenir de relation avec une autre table.
Voir également relation().
[override virtual] void QSqlRelationalTableModel::setTable(const QString &table)
Réimplémente : QSqlTableModel::setTable(const QString &tableName).
[override virtual protected] bool QSqlRelationalTableModel::updateRowInTable(int row, const QSqlRecord &values)
Réimplémente : 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.

