Présenter des données dans une vue de tableau
Les classes QSqlQueryModel, QSqlTableModel, et QSqlRelationalTableModel peuvent être utilisées comme source de données pour les classes de vues de Qt telles que QListView, QTableView, et QTreeView. En pratique, QTableView est de loin le choix le plus courant, parce qu'un ensemble de résultats SQL est essentiellement une structure de données à deux dimensions.

L'exemple suivant crée une vue basée sur un modèle de données SQL :
QTableView *view = new QTableView; view->setModel(model); view->show();
Si le modèle est un modèle en lecture-écriture (par exemple, QSqlTableModel), la vue permet à l'utilisateur de modifier les champs. Vous pouvez désactiver cette fonction en appelant
view->setEditTriggers(QAbstractItemView::NoEditTriggers);
Vous pouvez utiliser le même modèle comme source de données pour plusieurs vues. Si l'utilisateur modifie le modèle par l'intermédiaire d'une des vues, les autres vues reflètent immédiatement les modifications. L'exemple du modèle de tableau montre comment cela fonctionne.
Les classes de vues affichent un en-tête en haut pour étiqueter les colonnes. Pour modifier les textes de l'en-tête, appelez setHeaderData() sur le modèle. Les libellés de l'en-tête correspondent par défaut aux noms des champs de la table. Par exemple :
model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID")); model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name")); model->setHeaderData(2, Qt::Horizontal, QObject::tr("City")); model->setHeaderData(3, Qt::Horizontal, QObject::tr("Country"));
QTableView a également un en-tête vertical sur la gauche avec des numéros identifiant les lignes. Si vous insérez des lignes par programmation à l'aide de QSqlTableModel::insertRows(), les nouvelles lignes seront marquées d'un astérisque (*) jusqu'à ce qu'elles soient soumises à l'aide de submitAll() ou automatiquement lorsque l'utilisateur passe à un autre enregistrement (en supposant que edit strategy soit QSqlTableModel::OnRowChange).

De même, si vous supprimez des lignes en utilisant removeRows(), les lignes seront marquées d'un point d'exclamation ( !) jusqu'à ce que la modification soit soumise.
Les éléments de la vue sont rendus à l'aide d'un délégué. Le délégué par défaut, QStyledItemDelegate, gère les types de données les plus courants (int, QString, QImage, etc.). Le délégué est également chargé de fournir des widgets d'éditeur (par exemple, un combobox) lorsque l'utilisateur commence à modifier un élément de la vue. Vous pouvez créer vos propres délégués en sous-classant QAbstractItemDelegate ou QStyledItemDelegate. Voir Programmation Modèle/Vue pour plus d'informations.
QSqlTableModel est optimisé pour fonctionner sur une seule table à la fois. Si vous avez besoin d'un modèle en lecture-écriture qui fonctionne sur un ensemble de résultats arbitraire, vous pouvez sous-classer QSqlQueryModel et réimplémenter flags() et setData() pour le rendre en lecture-écriture. Les deux fonctions suivantes permettent de modifier les champs 1 et 2 d'un modèle de requête :
Qt::ItemFlags EditableSqlModel::flags(const QModelIndex &index) const { Qt::ItemFlags flags = QSqlQueryModel::flags(index); if (index.column() == 1 || index.column() == 2) flags |= Qt::ItemIsEditable; return flags; } bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int /* role */) { if (index.column() < 1 || index.column() > 2) return false; QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0); int id = data(primaryKeyIndex).toInt(); clear(); bool ok; if (index.column() == 1) ok = setFirstName(id, value.toString()); else ok = setLastName(id, value.toString()); refresh(); return ok; }
La fonction d'aide setFirstName() est définie comme suit :
bool EditableSqlModel::setFirstName(int personId, const QString &firstName) { QSqlQuery query; query.prepare("update person set firstname = ? where id = ?"); query.addBindValue(firstName); query.addBindValue(personId); return query.exec(); }
La fonction setLastName() est similaire. Voir l'exemple de modèle de requête pour le code source complet.
La sous-classification d'un modèle permet de le personnaliser de nombreuses façons : Vous pouvez fournir des infobulles pour les éléments, changer la couleur d'arrière-plan, fournir des valeurs calculées, fournir des valeurs différentes pour l'affichage et l'édition, traiter les valeurs nulles de manière spéciale, et plus encore. Pour plus de détails, voir la programmation des modèles et des vues ainsi que la documentation de référence QAbstractItemView.
Si tout ce dont vous avez besoin est de résoudre une clé étrangère en une chaîne plus conviviale, vous pouvez utiliser QSqlRelationalTableModel. Pour de meilleurs résultats, vous devriez également utiliser QSqlRelationalDelegate, un délégué qui fournit des éditeurs de boîtes combobox pour modifier les clés étrangères.

L'exemple du modèle de table relationnelle illustre comment utiliser QSqlRelationalTableModel en conjonction avec QSqlRelationalDelegate pour fournir des tables avec prise en charge des clés étrangères.
© 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.