QAbstractItemDelegate Class
La classe `QAbstractItemDelegate` sert à afficher et à modifier les éléments de données d'un modèle. En savoir plus...
| En-tête : | #include <QAbstractItemDelegate> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake : | QT += widgets |
| Hérite de : | QObject |
| Hérité par : |
Types publics
| enum | EndEditHint { NoHint, EditNextItem, EditPreviousItem, SubmitModelCache, RevertModelCache } |
Fonctions publiques
| QAbstractItemDelegate(QObject *parent = nullptr) | |
| virtual | ~QAbstractItemDelegate() |
| virtual QWidget * | createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const |
| virtual void | destroyEditor(QWidget *editor, const QModelIndex &index) const |
| virtual bool | editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) |
(since 6.10) bool | handleEditorEvent(QObject *editor, QEvent *event) |
| virtual bool | helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index) |
| virtual void | paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const = 0 |
| virtual void | setEditorData(QWidget *editor, const QModelIndex &index) const |
| virtual void | setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const |
| virtual QSize | sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const = 0 |
| virtual void | updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const |
Signaux
| void | closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint) |
| void | commitData(QWidget *editor) |
| void | sizeHintChanged(const QModelIndex &index) |
Description détaillée
Une classe QAbstractItemDelegate fournit l'interface et les fonctionnalités communes aux délégués dans l'architecture modèle/vue. Les délégués affichent des éléments individuels dans les vues et gèrent la modification des données du modèle.
La classe QAbstractItemDelegate fait partie des classes modèle/vue et s'inscrit dans le cadre modèle/vue de Qt.
Pour afficher un élément de manière personnalisée, vous devez implémenter les méthodes paint() et sizeHint(). La classe QStyledItemDelegate fournit des implémentations par défaut pour ces fonctions ; si vous n'avez pas besoin d'un affichage personnalisé, créez plutôt une sous-classe de cette classe.
Nous donnons un exemple de dessin d’une barre de progression dans des éléments ; dans notre cas, pour un programme de gestion de paquets.

Nous créons la classe ` WidgetDelegate `, qui hérite de ` QStyledItemDelegate`. Nous effectuons le dessin dans la fonction ` paint()` :
void WidgetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if (index.column() == 1) {
int progress = index.data().toInt();
QStyleOptionProgressBar progressBarOption;
progressBarOption.rect = option.rect;
progressBarOption.minimum = 0;
progressBarOption.maximum = 100;
progressBarOption.progress = progress;
progressBarOption.text = QString::number(progress) + "%";
progressBarOption.textVisible = true;
QApplication::style()->drawControl(QStyle::CE_ProgressBar,
&progressBarOption, painter);
} else
QStyledItemDelegate::paint(painter, option, index);Notez que nous utilisons un ` QStyleOptionProgressBar ` et que nous initialisons ses membres. Nous pouvons ensuite utiliser l’ QStyle actuel pour le dessiner.
Pour proposer une édition personnalisée, deux approches sont possibles. La première consiste à créer un widget d'édition et à l'afficher directement par-dessus l'élément. Pour ce faire, vous devez réimplémenter ` createEditor()` afin de fournir un widget d'édition, ` setEditorData()` pour remplir l'éditeur avec les données du modèle, et ` setModelData()` afin que le délégué puisse mettre à jour le modèle avec les données provenant de l'éditeur.
La deuxième approche consiste à gérer directement les événements utilisateur en réimplémentant editorEvent().
Voir également Programmation modèle/vue, QStyledItemDelegate et QStyle.
Documentation sur les types de membres
enum QAbstractItemDelegate::EndEditHint
Cette énumération décrit les différentes indications que le délégué peut fournir aux composants « modèle » et « vue » afin de rendre la modification des données dans un modèle plus conviviale pour l'utilisateur.
| Constante | Valeur | Description |
|---|---|---|
QAbstractItemDelegate::NoHint | 0 | Aucune action n’est recommandée. |
Ces conseils permettent au délégué d’influencer le comportement de la vue :
| Constante | Valeur | Description |
|---|---|---|
QAbstractItemDelegate::EditNextItem | 1 | La vue doit utiliser le délégué pour ouvrir un éditeur sur l'élément suivant de la vue. |
QAbstractItemDelegate::EditPreviousItem | 2 | La vue doit utiliser le délégué pour ouvrir un éditeur sur l'élément précédent de la vue. |
Notez que les vues personnalisées peuvent interpréter différemment les concepts de « suivant » et « précédent ».
Les conseils suivants sont particulièrement utiles lorsque l’on utilise des modèles qui mettent les données en cache, tels que ceux qui manipulent les données localement afin d’améliorer les performances ou d’économiser la bande passante réseau.
| Constante | Valeur | Description |
|---|---|---|
QAbstractItemDelegate::SubmitModelCache | 3 | Si le modèle met des données en cache, il doit écrire les données mises en cache dans le magasin de données sous-jacent. |
QAbstractItemDelegate::RevertModelCache | 4 | Si le modèle met des données en cache, il doit supprimer les données mises en cache et les remplacer par celles provenant du magasin de données sous-jacent. |
Bien que les modèles et les vues doivent répondre à ces indications de manière appropriée, les composants personnalisés peuvent en ignorer certaines, voire toutes, si elles ne sont pas pertinentes.
Documentation des fonctions membres
[explicit] QAbstractItemDelegate::QAbstractItemDelegate(QObject *parent = nullptr)
Crée un nouveau délégué d'élément abstrait avec l'parent on fournie.
[virtual noexcept] QAbstractItemDelegate::~QAbstractItemDelegate()
Supprime le délégué d'élément abstrait.
[signal] void QAbstractItemDelegate::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint)
Ce signal est émis lorsque l'utilisateur a terminé de modifier un élément à l'aide de l'editor spécifiée.
L'hint permet au délégué d’influencer le comportement du modèle et de la vue une fois l’édition terminée. Elle indique à ces composants quelle action doit être effectuée ensuite afin d’offrir une expérience d’édition fluide à l’utilisateur. Par exemple, si EditNextItem est spécifié, la vue doit utiliser un délégué pour ouvrir un éditeur sur l’élément suivant du modèle.
Voir également EndEditHint.
[signal] void QAbstractItemDelegate::commitData(QWidget *editor)
Ce signal doit être émis lorsque le widget « editor » a terminé la modification des données et souhaite les réécrire dans le modèle.
[virtual] QWidget *QAbstractItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
Renvoie l'éditeur à utiliser pour modifier l'élément de données avec l'index donné. Notez que l'index contient des informations sur le modèle utilisé. Le widget parent de l'éditeur est spécifié par parent, et les options de l'élément par option.
L'implémentation de base renvoie nullptr. Si vous souhaitez une édition personnalisée, vous devrez réimplémenter cette fonction.
Le widget d’éditeur renvoyé doit disposer de ` Qt::StrongFocus` ; sinon, les ` QMouseEvent` reçus par le widget se propageront à la vue. L’arrière-plan de la vue transparaîtra à moins que l’éditeur ne dessine son propre arrière-plan (par exemple, avec ` setAutoFillBackground()`).
Voir également destroyEditor(), setModelData() et setEditorData().
[virtual] void QAbstractItemDelegate::destroyEditor(QWidget *editor, const QModelIndex &index) const
Appelée lorsque l'editor n'est plus nécessaire pour modifier l'élément de données dont l'index est indiquée et doit être détruite. Le comportement par défaut consiste à appeler la méthode `deleteLater` de l'éditeur. Il est possible, par exemple, d'éviter cette suppression en réimplémentant cette fonction.
Voir également createEditor().
[virtual] bool QAbstractItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
Lorsque la modification d’un élément commence, cette fonction est appelée avec l’ event qui a déclenché la modification, l’ model, l’ index de l’élément et l’ option utilisé pour le rendu de l’élément.
Les événements de souris sont envoyés à editorEvent() même s'ils ne déclenchent pas la modification de l'élément. Cela peut, par exemple, s'avérer utile si vous souhaitez ouvrir un menu contextuel lorsque le bouton droit de la souris est cliqué sur un élément.
L'implémentation de base renvoie « false » (indiquant qu’elle n’a pas géré l’événement).
[since 6.10] bool QAbstractItemDelegate::handleEditorEvent(QObject *editor, QEvent *event)
Implémente la gestion standard des événements pour le compte de l'editor actuellement actif. Appelez cette fonction depuis une redéfinition de eventFilter() dans une sous-classe de QAbstractItemModel, puis renvoyez son résultat. Pour éviter tout double traitement des événements, n'appelez pas l'implémentation de la classe parente de eventFilter() après avoir appelé cette fonction.
Renvoie ` true ` si l’ editor fourni est un QWidget valide et si l’ event fourni est géré ; sinon, renvoie ` false`. Les événements de frappe de touche suivants sont gérés par défaut :
- Tab
- Backtab
- Enter
- Return
- Esc
Si le type de l’ editor est QTextEdit ou QPlainTextEdit, les touches Tab, Backtab, Enter et Return ne sont pas gérées.
Dans le cas des événements de pression sur les touches Tab, Backtab, Enter et Return, les données de editor sont validées dans le modèle et l’éditeur est fermé. Si event correspond à une pression sur la touche Tab, la vue ouvre un éditeur sur l’élément suivant de la vue. De même, si event correspond à une pression sur la touche Backtab, la vue ouvre un éditeur sur l’élément précédent de la vue.
Si l’événement correspond à une pression sur la touche Esc, la vue editor est fermée sans que ses données ne soient validées.
Cette fonction a été introduite dans Qt 6.10.
Voir également commitData() et closeEditor().
[virtual] bool QAbstractItemDelegate::helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index)
Chaque fois qu'un événement d'aide se produit, cette fonction est appelée avec les paramètres suivants : event, view, option et index, qui correspondent à l'élément où l'événement se produit.
Renvoie ` true ` si le délégué peut gérer l’événement ; sinon, renvoie ` false`. Une valeur de retour égale à `true` indique que les données obtenues à l’aide de l’index possédaient le rôle requis.
Pour les événements « QEvent::ToolTip » et « QEvent::WhatsThis » gérés avec succès, une fenêtre contextuelle peut s’afficher en fonction de la configuration système de l’utilisateur.
Voir également QHelpEvent.
[pure virtual] void QAbstractItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
Cette fonction purement abstraite doit être réimplémentée si vous souhaitez fournir un rendu personnalisé. Utilisez la méthode ` painter ` et le style ` option ` pour afficher l'élément spécifié par l'index.
Si vous la réimplémentez, vous devez également réimplémenter la méthode ` sizeHint()`.
[virtual] void QAbstractItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
Définit le contenu de l'editor spécifié sur les données correspondant à l'élément situé à l'index spécifiée. Notez que l'index contient des informations sur le modèle utilisé.
L'implémentation de base ne fait rien. Si vous souhaitez personnaliser l'édition, vous devrez réimplémenter cette fonction.
Voir également setModelData().
[virtual] void QAbstractItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
Définit les données de l'élément situé à l'index indiquée dans l'model, en lui attribuant le contenu de l'editor fournie.
L'implémentation de base ne fait rien. Si vous souhaitez personnaliser l'édition, vous devrez réimplémenter cette fonction.
Voir également setEditorData().
[pure virtual] QSize QAbstractItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
Cette fonction purement abstraite doit être réimplémentée si vous souhaitez proposer un rendu personnalisé. Les options sont spécifiées par option et l'élément du modèle par index.
Si vous la réimplémentez, vous devez également réimplémenter la méthode paint().
[signal] void QAbstractItemDelegate::sizeHintChanged(const QModelIndex &index)
Ce signal doit être émis lorsque la méthode ` sizeHint()` de ` index ` est appelée.
Les vues se connectent automatiquement à ce signal et réorganisent les éléments si nécessaire.
[virtual] void QAbstractItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
Met à jour la géométrie de l'editor pour l'élément dont l'index est indiquée, conformément au rectangle spécifié dans l'option. Si l'élément dispose d'une mise en page interne, l'éditeur s'adaptera en conséquence. Notez que l'index contient des informations sur le modèle utilisé.
L'implémentation de base ne fait rien. Si vous souhaitez une édition personnalisée, vous devez réimplémenter cette fonction.
© 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.