Sur cette page

QSqlRelationalTableModel Class

La classe QSqlRelationalTableModel fournit un modèle de données modifiable pour une table de base de données unique, avec prise en charge des clés étrangères. Plus d'informations...

En-tête : #include <QSqlRelationalTableModel>
CMake : find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake : QT += sql
Héritages : 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

Emplacements 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 agit comme QSqlTableModel, mais permet aux colonnes d'être définies comme clés étrangères dans 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 résolues en valeurs lisibles par l'homme. La capture d'écran de droite montre un modèle de table relationnelle QSqlRelationalTableModelel, avec des clés étrangères transformées en chaînes de texte lisibles par l'homme.

L'extrait de code suivant montre comment le modè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 le champ name de city à l'utilisateur. Le deuxième appel fait quelque chose de similaire avec la colonne 3.

Si vous utilisez un QSqlRelationalTableModel en lecture-écriture, vous voudrez probablement utiliser QSqlRelationalDelegate sur la vue. Contrairement au délégué par défaut, QSqlRelationalDelegate fournit une boîte de dialogue pour les champs qui sont des clés étrangères dans d'autres tables. Pour utiliser la 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 fournir des tables avec un support de clé étrangère.

L'utilisateur est en mesure de modifier une clé étrangère dans une table relationnelle.

Remarques :

  • La table doit avoir une clé primaire déclarée.
  • La clé primaire de la table ne peut pas contenir de relation avec une autre table.
  • Si une table relationnelle contient des clés qui renvoient à des lignes inexistantes dans la table référencée, les lignes contenant les clés non valides ne seront pas exposées par le biais du modèle. L'utilisateur ou la base de données est responsable du maintien de l'intégrité référentielle.
  • Si le nom de la 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 plus d'une relation, il sera aliasé. L'alias est composé du nom de la table de la relation, du nom de la colonne d'affichage et d'un identifiant unique joint par un trait de soulignement (par exemple, tablename_columnname_id). QSqlRecord::fieldName() renverra le nom de la colonne aliasée. Toutes les occurrences du nom de la colonne d'affichage dupliquée sont mises en alias lorsque la duplication est détectée, mais aucune mise en alias n'est faite pour les noms de colonnes dans la table principale. L'alias n'affecte pas QSqlRelation, de sorte que QSqlRelation::displayColumn() renverra le nom de la colonne d'affichage d'origine.
  • Le nom de la table de référence est remplacé par un alias. L'alias est constitué du mot "relTblAl" et de l'indice de la colonne lié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 l'exemple de modèle de table relationnelle.

Documentation sur les types de membres

enum QSqlRelationalTableModel::JoinMode

ConstanteValeurDescription du mode de jointure interne
QSqlRelationalTableModel::InnerJoin0- Mode jointure interne, renvoie les lignes lorsqu'il y a au moins une correspondance dans les deux tables.
QSqlRelationalTableModel::LeftJoin1- Mode jointure gauche, renvoie toutes les lignes de la table de gauche (nom_de_table1), même s'il n'y a pas de correspondance dans la table de droite (nom_de_table2).

Voir aussi QSqlRelationalTableModel::setJoinMode().

Documentation des fonctions membres

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

Crée un QSqlRelationalTableModel vide et définit le parent à parent et la connexion à la base de données à db. Si db n'est pas valide, la connexion à la base de données par défaut sera utilisée.

[virtual noexcept] QSqlRelationalTableModel::~QSqlRelationalTableModel()

Détruit l'objet et libère 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 également 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 pour la colonne column, ou une relation invalide si aucune relation n'est définie.

Voir aussi 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'y a pas de relation pour l'objet column.

L'objet retourné appartient à QSqlRelationalTableModel.

Voir aussi 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émente : 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 les données pour role dans l'élément avec index spécifié à value donné. En fonction de la stratégie d'édition, la valeur peut être appliquée à la base de données en une seule fois ou être mise en cache dans le modèle.

Retourne 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 être l'index et non la valeur d'affichage. Si un index est donné, il doit également exister dans la table référencée, sinon la fonction renvoie false. Si un QVariant() est transmis au lieu d'un index, l'index est effacé.

Voir aussi editStrategy(), data(), submit() et revertRow().

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

Définit le SQL joinMode pour montrer ou cacher les lignes avec des clés étrangères NULL. En mode InnerJoin (par défaut), ces lignes ne seront pas affichées : utilisez le mode LeftJoin si vous souhaitez les afficher.

Voir aussi QSqlRelationalTableModel::JoinMode.

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

Fait de l'adresse column un index étranger spécifié par l'adresse 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 le champ name de city à l'utilisateur.

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.