Présentation des données dans une vue de table
Les classes ` QSqlQueryModel`, ` QSqlTableModel` et ` QSqlRelationalTableModel ` peuvent être utilisées comme source de données pour les classes de vue de Qt telles que ` QListView`, ` QTableView` et ` QTreeView`. Dans la pratique, ` QTableView ` est de loin le choix le plus courant, car un jeu de résultats SQL est essentiellement une structure de données bidimensionnelle.

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 fonctionnalité 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 via l'une des vues, les autres vues refléteront immédiatement les modifications. L'exemple « Table Model » montre comment cela fonctionne.
Les classes de vue affichent un en-tête en haut de la page pour nommer les colonnes. Pour modifier les textes de l’en-tête, appelez la méthode ` setHeaderData()` sur le modèle. Par défaut, les libellés de l’en-tête correspondent 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 La vue comporte également un en-tête vertical à 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 validées à l’aide de ` submitAll()` ou automatiquement lorsque l’utilisateur passe à un autre enregistrement (en supposant que la propriété ` edit strategy ` soit définie sur ` QSqlTableModel::OnRowChange`).

De même, si vous supprimez des lignes à l'aide de ` removeRows()`, celles-ci seront marquées d'un point d'exclamation (!) jusqu'à ce que la modification soit validée.
Les éléments de la vue sont affichés à 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’édition (par exemple, une liste déroulante) 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 fonctionnant sur un ensemble de résultats arbitraire, vous pouvez créer une sous-classe de QSqlQueryModel et réimplémenter flags() et setData() pour le rendre accessible en lecture-écriture. Les deux fonctions suivantes rendent les champs 1 et 2 d'un modèle de requête modifiables :
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. Consultez l’exemple « Query Model » pour obtenir le code source complet.
La sous-classification d’un modèle permet de le personnaliser de nombreuses façons : vous pouvez ajouter des infobulles aux éléments, modifier la couleur d’arrière-plan, fournir des valeurs calculées, proposer des valeurs différentes pour l’affichage et la modification, gérer les valeurs nulles de manière spécifique, et bien plus encore. Consultez la section « Programmation modèle/vue » ainsi que la documentation de référence « QAbstractItemView » pour plus de détails.
Si vous avez simplement besoin de convertir une clé étrangère en une chaîne plus lisible, vous pouvez utiliser ` QSqlRelationalTableModel`. Pour obtenir de meilleurs résultats, vous devriez également utiliser ` QSqlRelationalDelegate`, un délégué qui fournit des éditeurs de liste déroulante pour la modification des clés étrangères.

L’exemple « Relational Table Model » illustre comment utiliser QSqlRelationalTableModel en association avec QSqlRelationalDelegate pour doter les tables d’une 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.