QStyledItemDelegate Class
La classe `QStyledItemDelegate` offre des fonctionnalités d'affichage et de modification des éléments de données provenant d'un modèle. En savoir plus...
| En-tête : | #include <QStyledItemDelegate> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake : | QT += widgets |
| Hérite de : | QAbstractItemDelegate |
| Hérité par : |
Fonctions publiques
| QStyledItemDelegate(QObject *parent = nullptr) | |
| virtual | ~QStyledItemDelegate() |
| virtual QString | displayText(const QVariant &value, const QLocale &locale) const |
| QItemEditorFactory * | itemEditorFactory() const |
| void | setItemEditorFactory(QItemEditorFactory *factory) |
Fonctions publiques réimplémentées
| virtual QWidget * | createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override |
| virtual void | paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override |
| virtual void | setEditorData(QWidget *editor, const QModelIndex &index) const override |
| virtual void | setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override |
| virtual QSize | sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override |
| virtual void | updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override |
Fonctions protégées
| virtual void | initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const |
Fonctions protégées réimplémentées
| virtual bool | editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override |
| virtual bool | eventFilter(QObject *object, QEvent *event) override |
Description détaillée
Lors de l'affichage de données provenant de modèles dans des vues d'éléments Qt, par exemple une QTableView, les éléments individuels sont dessinés par un délégué. De plus, lorsqu'un élément est modifié, celui-ci fournit un widget d'édition, qui est placé par-dessus la vue de l'élément pendant la modification. QStyledItemDelegate est le délégué par défaut de toutes les vues d'éléments Qt ; il y est associé lors de leur création.
La classe QStyledItemDelegate fait partie des classes Modèle/Vue et s'inscrit dans le cadre modèle/vue de Qt. Le délégué permet de développer l'affichage et la modification des éléments indépendamment du modèle et de la vue.
Les données des éléments dans les modèles se voient attribuer un « ItemDataRole » ; chaque élément peut stocker un « QVariant » pour chaque rôle. QStyledItemDelegate implémente l’affichage et la modification des types de données les plus courants attendus par les utilisateurs, notamment les booléens, les entiers et les chaînes de caractères.
Les données seront affichées différemment selon le rôle qu’elles occupent dans le modèle. Le tableau suivant décrit les rôles et les types de données que le délégué peut gérer pour chacun d’entre eux. Il suffit souvent de s’assurer que le modèle renvoie les données appropriées pour chacun des rôles afin de déterminer l’apparence des éléments dans les vues.
| Rôle | Types acceptés |
|---|---|
| Qt::BackgroundRole | QBrush |
| Qt::CheckStateRole | Qt::CheckState |
| Qt::DecorationRole | QIcon, QPixmap, QImage et QColor |
| Qt::DisplayRole | QString et les types disposant d’une représentation sous forme de chaîne de caractères |
| Qt::EditRole | Voir QItemEditorFactory pour plus de détails |
| Qt::FontRole | QFont |
| Qt::SizeHintRole | QSize |
| Qt::TextAlignmentRole | Qt::Alignment |
| Qt::ForegroundRole | QBrush |
Les éditeurs sont créés à l’aide d’une instance ` QItemEditorFactory` ; une instance statique par défaut fournie par ` QItemEditorFactory ` est installée sur tous les délégués d’éléments. Vous pouvez définir une fabrique personnalisée à l’aide de ` setItemEditorFactory()` ou définir une nouvelle fabrique par défaut à l’aide de ` QItemEditorFactory::setDefaultFactory()`.
QItemEditorFactory *editorFactory = new QItemEditorFactory;
QItemEditorCreatorBase *creator = new QStandardItemEditorCreator<MyFancyDateTimeEdit>();
editorFactory->registerEditor(QMetaType::QDateTime, creator);
QItemEditorFactory::setDefaultFactory(editorFactory);Une fois la nouvelle fabrique définie, tous les délégués d’éléments standard l’utiliseront (y compris les délégués créés avant la définition de la nouvelle fabrique par défaut).
Ce sont les données stockées dans le modèle d’élément via ` EditRole ` qui sont modifiées. Consultez la classe ` QItemEditorFactory ` pour une introduction plus générale aux fabriques d’éditeurs d’éléments.
Sous-classer QStyledItemDelegate
Si le délégué ne prend pas en charge le tracé des types de données dont vous avez besoin ou si vous souhaitez personnaliser le tracé des éléments, vous devez créer une sous-classe de QStyledItemDelegate et réimplémenter les méthodes paint() et, éventuellement, sizeHint(). La fonction paint() est appelée individuellement pour chaque élément, et grâce à sizeHint(), vous pouvez spécifier l’indicateur pour chacun d’entre eux.
Lors de la réimplémentation de paint(), on gère généralement les types de données que l’on souhaite afficher et on utilise l’implémentation de la superclasse pour les autres types.
Le tracé des indicateurs de case à cocher est effectué par le style actuel. Le style spécifie également la taille et les rectangles de délimitation dans lesquels dessiner les données pour les différents rôles de données. Le rectangle de délimitation de l’élément lui-même est également calculé par le style. Lors du tracé de types de données déjà pris en charge, il est donc recommandé de demander ces rectangles de délimitation au style. La description de la classe ` QStyle ` fournit plus de détails à ce sujet.
Si vous souhaitez modifier l’un des rectangles de délimitation calculés par le style ou le tracé des indicateurs de case à cocher, vous pouvez créer une sous-classe de ` QStyle`. Notez toutefois que la taille des éléments peut également être modifiée en réimplémentant la méthode ` sizeHint()`.
Il est possible pour un délégué personnalisé de fournir des éditeurs sans utiliser de fabrique d’éléments d’éditeur. Dans ce cas, les fonctions virtuelles suivantes doivent être réimplémentées :
- createEditor() renvoie le widget utilisé pour modifier les données du modèle et peut être réimplémentée pour personnaliser le comportement d’édition.
- setEditorData() fournit au widget les données à manipuler.
- updateEditorGeometry() garantit que l'éditeur s'affiche correctement par rapport à la vue de l'élément.
- setModelData() renvoie les données mises à jour au modèle.
L'exemple Star Delegate crée des éditeurs en réimplémentant ces méthodes.
QStyledItemDelegate et QItemDelegate
Depuis Qt 4.4, il existe deux classes de délégués : ` QItemDelegate ` et `QStyledItemDelegate`. Cependant, le délégué par défaut est `QStyledItemDelegate`. Ces deux classes constituent des alternatives indépendantes pour le dessin et la fourniture d’éditeurs aux éléments des vues. La différence entre les deux réside dans le fait que `QStyledItemDelegate` utilise le style actuel pour dessiner ses éléments. Nous recommandons donc d'utiliser `QStyledItemDelegate` comme classe de base lors de l'implémentation de délégués personnalisés ou lorsque vous travaillez avec des feuilles de style Qt. Le code requis pour l'une ou l'autre classe devrait être identique, sauf si le délégué personnalisé doit utiliser le style pour le dessin.
Si vous souhaitez personnaliser le dessin des vues d’éléments, vous devez implémenter un style personnalisé. Veuillez consulter la documentation de la classe ` QStyle ` pour plus de détails.
Voir également Classes de délégués, QItemDelegate, QAbstractItemDelegate, QStyle et Exemple de délégué Star.
Documentation sur les fonctions membres
[explicit] QStyledItemDelegate::QStyledItemDelegate(QObject *parent = nullptr)
Crée un délégué d'élément à partir de l'parent on fournie.
[virtual noexcept] QStyledItemDelegate::~QStyledItemDelegate()
Supprime le délégué de l'élément.
[override virtual] QWidget *QStyledItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
Réimplémente : ` QAbstractItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const`.
Renvoie le widget utilisé pour modifier l’élément spécifié par index. Le widget d’ parent et le style option permettent de contrôler l’apparence du widget d’édition.
Voir aussi QAbstractItemDelegate::createEditor().
[virtual] QString QStyledItemDelegate::displayText(const QVariant &value, const QLocale &locale) const
Cette fonction renvoie la chaîne que le délégué utilisera pour afficher l'Qt::DisplayRole du modèle dans locale. value correspond à la valeur de l'Qt::DisplayRole fournie par le modèle.
L'implémentation par défaut utilise l'QLocale::toString pour convertir value en QString.
Cette fonction n’est pas appelée pour les indices de modèle vides, c’est-à-dire les indices pour lesquels le modèle renvoie une valeur QVariant non valide.
Voir également QAbstractItemModel::data().
[override virtual protected] bool QStyledItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
Réimplémente : QAbstractItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index).
[override virtual protected] bool QStyledItemDelegate::eventFilter(QObject *object, QEvent *event)
Réimplémente : QObject::eventFilter(QObject *watched, QEvent *event).
Voir les détails dans QAbstractItemDelegate::handleEditorEvent().
[virtual protected] void QStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const
Initialisez ` option ` avec les valeurs fournies par l'index ` index`. Cette méthode est utile pour les sous-classes qui ont besoin d'un ` QStyleOptionViewItem`, mais ne souhaitent pas remplir elles-mêmes toutes les informations.
Voir également QStyleOption::initFrom().
QItemEditorFactory *QStyledItemDelegate::itemEditorFactory() const
Renvoie l'éditeur de fabrique utilisé par le délégué d'élément. Si aucun éditeur de fabrique n'est défini, la fonction renvoie null.
Voir également setItemEditorFactory().
[override virtual] void QStyledItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
Réimplémente : QAbstractItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const.
Affiche le délégué en utilisant l’ painter et l’ option de style fournis pour l’élément spécifié par index.
Cette fonction dessine l'élément en utilisant l'QStyle de la vue.
Lors de la réimplémentation de paint dans une sous-classe, utilisez la méthode initStyleOption() pour configurer l’ option de la même manière que QStyledItemDelegate.
Dans la mesure du possible, utilisez la méthode ` option ` pendant le dessin. Utilisez notamment sa variable ` rect ` pour déterminer où dessiner et sa variable ` state ` pour déterminer si l’élément est activé ou sélectionné.
Après le dessin, vous devez vous assurer que le « painter » est remis dans l’état dans lequel il se trouvait lors de l’appel de cette fonction. Par exemple, il peut être utile d’appeler ` QPainter::save()` avant le dessin et ` QPainter::restore()` après.
Voir également QItemDelegate::paint(), QStyle::drawControl() et QStyle::CE_ItemViewItem.
[override virtual] void QStyledItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
Réimplémente : QAbstractItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const.
Définit les données à afficher et à modifier par l'editor à partir de l'élément du modèle de données spécifié par l'index.
L'implémentation par défaut stocke les données dans la propriété « user » du widget « editor ».
Voir aussi ` QMetaProperty::isUser()` .
void QStyledItemDelegate::setItemEditorFactory(QItemEditorFactory *factory)
Définit la fabrique d'éditeurs que le délégué d'élément doit utiliser comme étant celle spécifiée à l'adresse factory. Si aucune fabrique d'éditeurs n'est définie, le délégué d'élément utilisera la fabrique d'éditeurs par défaut.
Voir également itemEditorFactory().
[override virtual] void QStyledItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
Réimplémente : QAbstractItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const.
Récupère les données du widget « editor » et les stocke dans l'model spécifié, à l'emplacement index.
L'implémentation par défaut récupère la valeur à stocker dans le modèle de données à partir de la propriété utilisateur du widget « editor ».
Voir également QMetaProperty::isUser().
[override virtual] QSize QStyledItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
Réimplémente : QAbstractItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const.
Renvoie la taille nécessaire au délégué pour afficher l’élément spécifié par ` index`, en tenant compte des informations de style fournies par ` option`.
Cette fonction utilise la propriété ` QStyle ` de la vue pour déterminer la taille de l'élément.
Voir également QStyle::sizeFromContents() et QStyle::CT_ItemViewItem.
[override virtual] void QStyledItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
Réimplémente : QAbstractItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const.
Met à jour l'objet ` editor ` correspondant à l'élément spécifié par ` index `, conformément à l'option de style fournie.
© 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.