Sur cette page

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

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.

Table présentant la ville et le pays sous forme de valeurs numériques de clé étrangèreTableau présentant les noms de villes et de pays convertis en chaînes de caractères

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.

L'utilisateur peut modifier une clé étrangère dans une table relationnelle

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

ConstanteValeurDescription
QSqlRelationalTableModel::InnerJoin0- Mode de jointure interne : renvoie les lignes lorsqu'il existe au moins une correspondance dans les deux tables.
QSqlRelationalTableModel::LeftJoin1- 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.