Sur cette page

Utilisation des classes du modèle SQL

Outre QSqlQuery, Qt propose trois classes de plus haut niveau pour accéder aux bases de données. Ces classes sont QSqlQueryModel, QSqlTableModel et QSqlRelationalTableModel.

QSqlQueryModelUn modèle en lecture seule basé sur une requête SQL arbitraire.
QSqlTableModelUn modèle en lecture-écriture fonctionnant sur une seule table.
QSqlRelationalTableModelUne sous-classe de ` QSqlTableModel ` prenant en charge les clés étrangères.

Ces classes dérivent de ` QAbstractTableModel ` (qui hérite elle-même de ` QAbstractItemModel`) et facilitent la présentation des données issues d'une base de données dans une classe de vue d'élément telle que ` QListView ` et ` QTableView`. Ceci est expliqué en détail dans la section « Présentation des données dans une vue de table ».

Un autre avantage de l’utilisation de ces classes est qu’elles facilitent l’adaptation de votre code à d’autres sources de données. Par exemple, si vous utilisez QSqlTableModel et que vous décidez par la suite d’utiliser des fichiers XML pour stocker les données à la place d’une base de données, il suffit essentiellement de remplacer un modèle de données par un autre.

Le modèle de requête SQL

QSqlQueryModel propose un modèle en lecture seule basé sur une requête SQL.

Exemple :

    QSqlQueryModel model;
    model.setQuery("SELECT * FROM employee");

    for (int i = 0; i < model.rowCount();++i) {
        int id = model.record(i).value("id").toInt();
        QString name = model.record(i).value("name").toString();
        qDebug() << id << name;
    }

Après avoir défini la requête à l'aide de ` QSqlQueryModel::setQuery()`, vous pouvez utiliser ` QSqlQueryModel::record(int)` pour accéder aux enregistrements individuels. Vous pouvez également utiliser ` QSqlQueryModel::data()` et n'importe laquelle des autres fonctions héritées de ` QAbstractItemModel`.

Il existe également une surcharge de la fonction setQuery() qui prend un objet QSqlQuery en paramètre et opère sur son jeu de résultats. Cela vous permet d’utiliser toutes les fonctionnalités de QSqlQuery pour configurer la requête (par exemple, les requêtes préparées).

Le modèle de table SQL

QSqlTableModel propose un modèle en lecture-écriture qui fonctionne sur une seule table SQL à la fois.

Exemple :

    QSqlTableModel model;
    model.setTable("employee");
    model.setFilter("salary > 50000");
    model.setSort(2, Qt::DescendingOrder);
    model.select();

    for (int i = 0; i < model.rowCount();++i) {
        QString nom = modèle.enregistrement(i).valeur("nom").toString();
        int salaire = modèle.enregistrement(i).valeur("salaire").toInt();
        qDebug() << name << salary;
    }

QSqlTableModel est une alternative de haut niveau à QSqlQuery pour parcourir et modifier des tables SQL individuelles. Elle permet généralement d'écrire moins de code et ne nécessite aucune connaissance de la syntaxe SQL.

Utilisez ` QSqlTableModel::record()` pour récupérer une ligne de la table, et ` QSqlTableModel::setRecord()` pour la modifier. Par exemple, le code suivant augmentera le salaire de chaque employé de 10 % :

    for (int i = 0; i < model.rowCount(); ++i) {
        QSqlRecord record = model.record(i);
        double salary = record.value("salary").toInt();
        salary *= 1.1;
        record.setValue("salary", salary);
        model.setRecord(i, record);
    }
    model.submitAll();

Vous pouvez également utiliser les méthodes ` QSqlTableModel::data()` et ` QSqlTableModel::setData()`, héritées de la classe ` QAbstractItemModel`, pour accéder aux données. Voici par exemple comment mettre à jour un enregistrement à l’aide de la méthode ` setData()` :

    model.setData(model.index(row, column), 75000);
    model.submitAll();

Voici comment insérer une ligne et la remplir :

    model.insertRows(row, 1);
    model.setData(model.index(row, 0), 1013);
    model.setData(model.index(row, 1), "Peter Gordon");
    model.setData(model.index(row, 2), 68500);
    model.submitAll();

Voici comment supprimer cinq lignes consécutives :

    model.removeRows(row, 5);
    model.submitAll();

Le premier argument de la fonction QSqlTableModel::removeRows() est l'index de la première ligne à supprimer.

Lorsque vous avez terminé de modifier un enregistrement, vous devez toujours appeler la fonction QSqlTableModel::submitAll() pour vous assurer que les modifications sont bien enregistrées dans la base de données.

La nécessité d’appeler submitAll(), ainsi que le moment où le faire, dépendent de la propriété edit strategy de la table. La stratégie par défaut est QSqlTableModel::OnRowChange, qui spécifie que les modifications en attente sont appliquées à la base de données lorsque l’utilisateur sélectionne une autre ligne. D’autres stratégies sont disponibles : « QSqlTableModel::OnManualSubmit » (où toutes les modifications sont mises en cache dans le modèle jusqu’à ce que vous appeliez `submitAll()`) et « QSqlTableModel::OnFieldChange » (où aucune modification n’est mise en cache). Celles-ci sont particulièrement utiles lorsque ` QSqlTableModel ` est utilisé avec une vue.

QSqlTableModel::OnFieldChange semble tenir sa promesse : vous n’avez jamais besoin d’appeler explicitement `submitAll()`. Il existe toutefois deux pièges :

  • Sans mise en cache, les performances peuvent chuter de manière significative.
  • Si vous modifiez une clé primaire, l’enregistrement risque de vous échapper pendant que vous essayez de le remplir.

Le modèle de table relationnelle SQL

QSqlRelationalTableModel étend le modèle « QSqlTableModel » pour prendre en charge les clés étrangères. Une clé étrangère est un mappage biunivoque entre un champ d’une table et le champ de clé primaire d’une autre table. Par exemple, si la table « book » comporte un champ nommé « authorid » qui fait référence au champ « id » de la table «author», on dit que « authorid » est une clé étrangère.

Tableau 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 une QSqlTableModel sans mise en forme dans une 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 une QSqlRelationalTableModel, dans laquelle les clés étrangères sont converties en chaînes de texte lisibles par l’utilisateur.

L'extrait de code suivant montre comment l'QSqlRelationalTableModel a été configuré :

    model->setTable("employee");

    model->setRelation(2, QSqlRelation("city", "id", "name"));
    model->setRelation(3, QSqlRelation("country", "id", "name"));

Consultez la documentation d’ QSqlRelationalTableModel pour plus de détails.

© 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.