Sur cette page

QSqlQueryModel Class

La classe QSqlQueryModel fournit un modèle de données en lecture seule pour les ensembles de résultats SQL. Plus d'informations...

En-tête : #include <QSqlQueryModel>
CMake : find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake : QT += sql
Hérite : QAbstractTableModel
Hérité par :

QSqlTableModel

Fonctions publiques

QSqlQueryModel(QObject *parent = nullptr)
virtual ~QSqlQueryModel()
virtual void clear()
QSqlError lastError() const
const QSqlQuery &query() const
QSqlRecord record(int row) const
QSqlRecord record() const
(since 6.9) void refresh()
(since 6.2) void setQuery(QSqlQuery &&query)
void setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase())

Fonctions publiques réimplémentées

virtual bool canFetchMore(const QModelIndex &parent = QModelIndex()) const override
virtual int columnCount(const QModelIndex &index = QModelIndex()) const override
virtual QVariant data(const QModelIndex &item, int role = Qt::DisplayRole) const override
virtual void fetchMore(const QModelIndex &parent = QModelIndex()) override
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
virtual QHash<int, QByteArray> roleNames() const override
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override
virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override

Fonctions protégées

virtual QModelIndex indexInQuery(const QModelIndex &item) const
virtual void queryChange()
void setLastError(const QSqlError &error)

Description détaillée

QSqlQueryModel est une interface de haut niveau permettant d'exécuter des instructions SQL et de parcourir l'ensemble des résultats. Elle est construite au-dessus de l'interface de niveau inférieur QSqlQuery et peut être utilisée pour fournir des données à des classes de vue telles que QTableView. A titre d'exemple :

    QSqlQueryModel *model = new QSqlQueryModel;
    model->setQuery("SELECT name, salary FROM employee");
    model->setHeaderData(0, Qt::Horizontal, tr("Name"));
    model->setHeaderData(1, Qt::Horizontal, tr("Salary"));
    QTableView *view = new QTableView;
    view->setModel(model);
    view->show();

Nous définissons la requête du modèle, puis les étiquettes affichées dans l'en-tête de la vue.

QSqlQueryModel peut également être utilisé pour accéder à une base de données de manière programmatique, sans la lier à une vue :

    QSqlQueryModel model;
    model.setQuery("SELECT name, salary FROM employee");
    int salary = model.record(4).value("salary").toInt();

L'extrait de code ci-dessus extrait le champ salary de l'enregistrement 4 du jeu de résultats de la requête SELECT. Comme salary est la deuxième colonne (ou l'indice de colonne 1), nous pouvons réécrire la dernière ligne comme suit :

    int salary = model.data(model.index(4, 1)).toInt();

Le modèle est en lecture seule par défaut. Pour le rendre en lecture-écriture, vous devez le sous-classer et réimplémenter setData() et flags(). Une autre option consiste à utiliser QSqlTableModel, qui fournit un modèle en lecture-écriture basé sur une seule table de base de données.

L'exemple querymodel illustre comment utiliser QSqlQueryModel pour afficher le résultat d'une requête. Il montre également comment sous-classer QSqlQueryModel pour personnaliser le contenu des données avant de les montrer à l'utilisateur, et comment créer un modèle en lecture-écriture basé sur QSqlQueryModel.

Si la base de données ne renvoie pas le nombre de lignes sélectionnées dans une requête, le modèle récupère les lignes de manière incrémentielle. Voir fetchMore() pour plus d'informations.

Voir aussi QSqlTableModel, QSqlRelationalTableModel, QSqlQuery, Model/View Programming, et Query Model Example.

Documentation sur les fonctions membres

[explicit] QSqlQueryModel::QSqlQueryModel(QObject *parent = nullptr)

Crée un QSqlQueryModel vide avec l'adresse parent.

[virtual noexcept] QSqlQueryModel::~QSqlQueryModel()

Détruit l'objet et libère les ressources allouées.

Voir également clear().

[override virtual] bool QSqlQueryModel::canFetchMore(const QModelIndex &parent = QModelIndex()) const

Réimplémente : QAbstractItemModel::canFetchMore(const QModelIndex &parent) const.

Renvoie true s'il est possible de lire plus de lignes dans la base de données. Cela n'affecte que les bases de données qui n'indiquent pas la taille d'une requête (voir QSqlDriver::hasFeature()).

parent devrait toujours être une valeur invalide QModelIndex.

Voir également fetchMore().

[virtual] void QSqlQueryModel::clear()

Efface le modèle et libère toute ressource acquise.

[override virtual] int QSqlQueryModel::columnCount(const QModelIndex &index = QModelIndex()) const

Réimplémente : QAbstractItemModel::columnCount(const QModelIndex &parent) const.

[override virtual] QVariant QSqlQueryModel::data(const QModelIndex &item, int role = Qt::DisplayRole) const

Réimplémente : QAbstractItemModel::data(const QModelIndex &index, int role) const.

Renvoie la valeur pour les valeurs spécifiées item et role.

Si item est hors limites ou si une erreur s'est produite, une valeur invalide QVariant est renvoyée.

Voir aussi lastError().

[override virtual] void QSqlQueryModel::fetchMore(const QModelIndex &parent = QModelIndex())

Réimplémente : QAbstractItemModel::fetchMore(const QModelIndex &parent).

Récupère plus de lignes d'une base de données. Cela n'affecte que les bases de données qui n'indiquent pas la taille d'une requête (voir QSqlDriver::hasFeature()).

Pour forcer la récupération de l'ensemble des résultats, vous pouvez utiliser ce qui suit :

while (myModel->canFetchMore())
    myModel->fetchMore();

parent should always be an invalid QModelIndex.

Voir également canFetchMore().

[override virtual] QVariant QSqlQueryModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const

Réimplémente : QAbstractItemModel::headerData(int section, Qt::Orientation orientation, int role) const.

Renvoie les données d'en-tête pour l'adresse role donnée dans l'adresse section de l'en-tête avec l'adresse orientation spécifiée.

Voir aussi setHeaderData().

[virtual protected] QModelIndex QSqlQueryModel::indexInQuery(const QModelIndex &item) const

Renvoie l'index de la valeur dans l'ensemble de résultats de la base de données pour l'adresse item donnée dans le modèle.

La valeur retournée est identique à item si aucune colonne ou ligne n'a été insérée, supprimée ou déplacée.

Renvoie un index de modèle non valide si item est hors limites ou si item ne pointe pas vers une valeur dans le jeu de résultats.

Voir aussi QSqlTableModel::indexInQuery(), insertColumns() et removeColumns().

[override virtual] bool QSqlQueryModel::insertColumns(int column, int count, const QModelIndex &parent = QModelIndex())

Réimplémente : QAbstractItemModel::insertColumns(int column, int count, const QModelIndex &parent).

Insère les colonnes count dans le modèle à la position column. Le paramètre parent doit toujours être un QModelIndex invalide, car le modèle ne prend pas en charge les relations parent-enfant.

Retourne true si column est dans les limites, sinon retourne false.

Par défaut, les colonnes insérées sont vides. Pour les remplir avec des données, réimplémentez data() et traitez chaque colonne insérée séparément :

QVariant MyModel::data(const QModelIndex &item, int role) const
{
    if (item.column() == m_specialColumnNo) {
        // handle column separately
    }
    return QSqlQueryModel::data(item, role);
}

Voir également removeColumns().

QSqlError QSqlQueryModel::lastError() const

Renvoie des informations sur la dernière erreur survenue dans la base de données.

Voir aussi setLastError() et query().

const QSqlQuery &QSqlQueryModel::query() const

Renvoie une référence à l'objet const QSqlQuery associé à ce modèle.

Voir aussi setQuery().

[virtual protected] void QSqlQueryModel::queryChange()

Cette fonction virtuelle est appelée chaque fois que la requête est modifiée. L'implémentation par défaut ne fait rien.

query() renvoie la nouvelle requête.

Voir aussi query() et setQuery().

QSqlRecord QSqlQueryModel::record(int row) const

Renvoie l'enregistrement contenant des informations sur les champs de la requête en cours. Si row est l'index d'une ligne valide, l'enregistrement sera rempli avec les valeurs de cette ligne.

Si le modèle n'est pas initialisé, un enregistrement vide sera retourné.

Voir aussi QSqlRecord::isEmpty().

QSqlRecord QSqlQueryModel::record() const

Renvoie un enregistrement vide contenant des informations sur les champs de la requête en cours.

Si le modèle n'est pas initialisé, un enregistrement vide sera retourné.

Il s'agit d'une fonction surchargée.

Voir aussi QSqlRecord::isEmpty().

[since 6.9] void QSqlQueryModel::refresh()

Ré-exécute la requête en cours pour récupérer les données à partir de la même connexion à la base de données.

Remarque : refresh() n'est pas applicable lorsque la requête contient des valeurs liées.

Cette fonction a été introduite dans Qt 6.9.

Voir aussi setQuery(QSqlQuery &&query) et QSqlQuery::boundValue().

[override virtual] bool QSqlQueryModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())

Réimplémente : QAbstractItemModel::removeColumns(int column, int count, const QModelIndex &parent).

Supprime les colonnes count du modèle à partir de la position column. Le paramètre parent doit toujours être un QModelIndex invalide, car le modèle ne prend pas en charge les relations parent-enfant.

La suppression des colonnes les cache effectivement. Cela n'affecte pas le modèle sous-jacent QSqlQuery.

Renvoie true si les colonnes ont été supprimées ; sinon, renvoie false.

[override virtual] QHash<int, QByteArray> QSqlQueryModel::roleNames() const

Réimplémente : QAbstractItemModel::roleNames() const.

Renvoie les noms des rôles du modèle.

Qt ne définit qu'un seul rôle pour QSqlQueryModel:

Rôle QtNom du rôle QML
Qt::DisplayRoleaffichage

[override virtual] int QSqlQueryModel::rowCount(const QModelIndex &parent = QModelIndex()) const

Réimplémente : QAbstractItemModel::rowCount(const QModelIndex &parent) const.

Si la base de données prend en charge le renvoi de la taille d'une requête (voir QSqlDriver::hasFeature()), le nombre de lignes de la requête en cours est renvoyé. Sinon, il renvoie le nombre de lignes actuellement mises en cache sur le client.

parent devrait toujours être une valeur invalide QModelIndex.

Voir également canFetchMore() et QSqlDriver::hasFeature().

[override virtual] bool QSqlQueryModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole)

Réimplémente : QAbstractItemModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role).

Définit la légende d'un en-tête horizontal pour l'adresse role spécifiée à value. Cela est utile si le modèle est utilisé pour afficher des données dans une vue (par exemple, QTableView).

Renvoie true si orientation est Qt::Horizontal et si section renvoie à une section valide ; sinon, renvoie false.

Notez que cette fonction ne peut pas être utilisée pour modifier des valeurs dans la base de données puisque le modèle est en lecture seule.

Voir également headerData() et data().

[protected] void QSqlQueryModel::setLastError(const QSqlError &error)

Fonction protégée qui permet aux classes dérivées de fixer la valeur de la dernière erreur survenue dans la base de données à error.

Voir également lastError().

[since 6.2] void QSqlQueryModel::setQuery(QSqlQuery &&query)

Réinitialise le modèle et définit le fournisseur de données comme étant l'adresse query. Notez que la requête doit être active et ne doit pas être isForwardOnly().

lastError() peut être utilisé pour obtenir des informations détaillées en cas d'erreur lors de la définition de la requête.

Remarque : l'appel à setQuery() supprimera toutes les colonnes insérées.

Cette fonction a été introduite dans Qt 6.2.

Voir aussi query(), QSqlQuery::isActive(), QSqlQuery::setForwardOnly(), et lastError().

void QSqlQueryModel::setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase())

Exécute la requête query pour la connexion à la base de données donnée db. Si aucune base de données (ou une base de données non valide) n'est spécifiée, la connexion par défaut est utilisée.

lastError() peut être utilisé pour obtenir des informations détaillées en cas d'erreur lors de la définition de la requête.

Exemple :

QSqlQueryModel model ; model.setQuery("select * from MyTable") ;if (model.lastError().isValid())    qDebug() << model.lastError();

Il s'agit d'une fonction surchargée.

Voir aussi query(), queryChange() et lastError().

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