QAbstractItemDelegate Class
Die Klasse „QAbstractItemDelegate“ dient zur Anzeige und Bearbeitung von Datenelementen aus einem Modell. Mehr...
| Kopfzeile: | #include <QAbstractItemDelegate> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| Erbt von: | QObject |
| Vererbt an: |
Öffentliche Typen
| enum | EndEditHint { NoHint, EditNextItem, EditPreviousItem, SubmitModelCache, RevertModelCache } |
Öffentliche Funktionen
| 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 |
Signale
| void | closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint) |
| void | commitData(QWidget *editor) |
| void | sizeHintChanged(const QModelIndex &index) |
Ausführliche Beschreibung
Eine QAbstractItemDelegate-Klasse stellt die Schnittstelle und die allgemeinen Funktionen für Delegaten in der Model-View-Architektur bereit. Delegaten zeigen einzelne Elemente in Ansichten an und übernehmen die Bearbeitung von Modelldaten.
Die Klasse `QAbstractItemDelegate` gehört zu den Modell-Ansicht-Klassen und ist Teil des Modell-Ansicht-Frameworks von Qt.
Um ein Element auf benutzerdefinierte Weise darzustellen, müssen Sie die Methoden ` paint()` und ` sizeHint()` implementieren. Die Klasse ` QStyledItemDelegate ` stellt Standardimplementierungen für diese Funktionen bereit; wenn Sie keine benutzerdefinierte Darstellung benötigen, erstellen Sie stattdessen eine Unterklasse dieser Klasse.
Wir zeigen ein Beispiel für das Zeichnen eines Fortschrittsbalkens in `Items`; in unserem Fall für ein Paketverwaltungsprogramm.

Wir erstellen die Klasse ` WidgetDelegate `, die von ` QStyledItemDelegate` erbt. Das Zeichnen erfolgt in der Funktion ` 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);Beachten Sie, dass wir ein ` QStyleOptionProgressBar ` verwenden und dessen Mitglieder initialisieren. Anschließend können wir das aktuelle ` QStyle ` nutzen, um es zu zeichnen.
Um eine benutzerdefinierte Bearbeitung zu ermöglichen, gibt es zwei Ansätze, die verwendet werden können. Der erste Ansatz besteht darin, ein Editor-Widget zu erstellen und es direkt über dem Element anzuzeigen. Dazu müssen Sie die Methode ` createEditor()` neu implementieren, um ein Editor-Widget bereitzustellen, die Methode ` setEditorData()` neu implementieren, um den Editor mit den Daten aus dem Modell zu füllen, und die Methode ` setModelData()` neu implementieren, damit der Delegat das Modell mit Daten aus dem Editor aktualisieren kann.
Der zweite Ansatz besteht darin, Benutzerereignisse direkt zu verarbeiten, indem Sie ` editorEvent()` neu implementieren.
Siehe auch „Model/View-Programmierung“, „ QStyledItemDelegate “ und „ QStyle “.
Dokumentation zum Mitgliedstyp
enum QAbstractItemDelegate::EndEditHint
Diese Enumeration beschreibt die verschiedenen Hinweise, die der Delegat den Modell- und Ansichtskomponenten geben kann, um die Bearbeitung von Daten in einem Modell für den Benutzer so komfortabel wie möglich zu gestalten.
| Konstante | Wert | Beschreibung |
|---|---|---|
QAbstractItemDelegate::NoHint | 0 | Es wird keine bestimmte Aktion empfohlen. |
Mit diesen Hinweisen kann der Delegat das Verhalten der Ansicht beeinflussen:
| Konstante | Wert | Beschreibung |
|---|---|---|
QAbstractItemDelegate::EditNextItem | 1 | Die Ansicht sollte den Delegaten verwenden, um einen Editor für das nächste Element in der Ansicht zu öffnen. |
QAbstractItemDelegate::EditPreviousItem | 2 | Die Ansicht sollte den Delegaten verwenden, um einen Editor für das vorherige Element in der Ansicht zu öffnen. |
Beachten Sie, dass benutzerdefinierte Ansichten die Begriffe „nächstes“ und „vorheriges“ möglicherweise unterschiedlich interpretieren.
Die folgenden Hinweise sind besonders nützlich, wenn Modelle verwendet werden, die Daten zwischenspeichern, z. B. solche, die Daten lokal bearbeiten, um die Leistung zu steigern oder Netzwerkbandbreite zu sparen.
| Konstante | Wert | Beschreibung |
|---|---|---|
QAbstractItemDelegate::SubmitModelCache | 3 | Wenn das Modell Daten zwischenspeichert, sollte es die zwischengespeicherten Daten in den zugrunde liegenden Datenspeicher schreiben. |
QAbstractItemDelegate::RevertModelCache | 4 | Wenn das Modell Daten zwischenspeichert, sollte es die zwischengespeicherten Daten verwerfen und durch Daten aus dem zugrunde liegenden Datenspeicher ersetzen. |
Obwohl Modelle und Ansichten auf diese Hinweise in angemessener Weise reagieren sollten, können benutzerdefinierte Komponenten einzelne oder alle davon ignorieren, wenn sie nicht relevant sind.
Dokumentation der Mitgliedsfunktionen
[explicit] QAbstractItemDelegate::QAbstractItemDelegate(QObject *parent = nullptr)
Erstellt einen neuen abstrakten Element-Delegaten mit dem angegebenen „ parent “.
[virtual noexcept] QAbstractItemDelegate::~QAbstractItemDelegate()
Löscht den abstrakten Item-Delegaten.
[signal] void QAbstractItemDelegate::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint)
Dieses Signal wird ausgelöst, wenn der Benutzer die Bearbeitung eines Elements mithilfe des angegebenen „ editor “ abgeschlossen hat.
Die ` hint ` bietet dem Delegaten die Möglichkeit, das Verhalten des Modells und der Ansicht nach Abschluss der Bearbeitung zu beeinflussen. Sie gibt diesen Komponenten vor, welche Aktion als Nächstes ausgeführt werden soll, um dem Benutzer ein komfortables Bearbeitungserlebnis zu bieten. Wenn beispielsweise ` EditNextItem ` angegeben ist, sollte die Ansicht mithilfe eines Delegaten einen Editor für das nächste Element im Modell öffnen.
Siehe auch „ EndEditHint “.
[signal] void QAbstractItemDelegate::commitData(QWidget *editor)
Dieses Signal muss ausgelöst werden, wenn das Widget „ editor “ die Bearbeitung der Daten abgeschlossen hat und diese wieder in das Modell zurückschreiben möchte.
[virtual] QWidget *QAbstractItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
Gibt den Editor zurück, der zum Bearbeiten des Datenelements mit dem angegebenen ` index` verwendet werden soll. Beachten Sie, dass der Index Informationen über das verwendete Modell enthält. Das übergeordnete Widget des Editors wird durch ` parent` angegeben, und die Elementoptionen durch ` option`.
Die Basisimplementierung gibt ` nullptr` zurück. Wenn Sie eine benutzerdefinierte Bearbeitung wünschen, müssen Sie diese Funktion neu implementieren.
Das zurückgegebene Editor-Widget sollte über ` Qt::StrongFocus` verfügen; andernfalls werden die vom Widget empfangenen ` QMouseEvent` an die Ansicht weitergegeben. Der Hintergrund der Ansicht scheint durch, es sei denn, der Editor zeichnet seinen eigenen Hintergrund (z. B. mit ` setAutoFillBackground()`).
Siehe auch ` destroyEditor()`, ` setModelData()` und ` setEditorData()`.
[virtual] void QAbstractItemDelegate::destroyEditor(QWidget *editor, const QModelIndex &index) const
Wird aufgerufen, wenn der „ editor “ für die Bearbeitung des Datenelements mit dem angegebenen „ index “ nicht mehr benötigt wird und gelöscht werden soll. Das Standardverhalten ist ein Aufruf von „deleteLater“ für den Editor. Es ist beispielsweise möglich, diese Löschung zu vermeiden, indem diese Funktion neu implementiert wird.
Siehe auch „ createEditor()“.
[virtual] bool QAbstractItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
Wenn die Bearbeitung eines Elements beginnt, wird diese Funktion mit dem „ event “, der die Bearbeitung ausgelöst hat, dem „ model “, dem „ index “ des Elements und dem „ option “, der für die Darstellung des Elements verwendet wird, aufgerufen.
Mausereignisse werden an `editorEvent()` gesendet, auch wenn sie keine Bearbeitung des Elements auslösen. Dies kann beispielsweise nützlich sein, wenn Sie beim Klicken mit der rechten Maustaste auf ein Element ein Kontextmenü öffnen möchten.
Die Basisimplementierung gibt ` false ` zurück (was bedeutet, dass das Ereignis nicht verarbeitet wurde).
[since 6.10] bool QAbstractItemDelegate::handleEditorEvent(QObject *editor, QEvent *event)
Implementiert die Standardverarbeitung von Ereignissen für das aktuell aktive editor. Rufen Sie diese Funktion aus einer Überschreibung von eventFilter() in einer Unterklasse von QAbstractItemModel auf und geben Sie das Ergebnis zurück. Um eine doppelte Ereignisverarbeitung zu vermeiden, dürfen Sie die Implementierung von eventFilter() in der übergeordneten Klasse nach dem Aufruf dieser Funktion nicht mehr aufrufen.
Gibt „ true “ zurück, wenn das angegebene „ editor “ ein gültiges „ QWidget “ ist und das angegebene „ event “ verarbeitet wird; andernfalls wird „ false “ zurückgegeben. Die folgenden Tastendruckereignisse werden standardmäßig verarbeitet:
- Tab
- Backtab
- Enter
- Return
- Esc
Wenn der Typ von „ editor “ „ QTextEdit “ oder „ QPlainTextEdit “ ist, werden die Tasten „ Tab “, „ Backtab “, „ Enter “ und „ Return “ nicht verarbeitet.
Bei Tastenanschlagereignissen für „ Tab “, „ Backtab “, „ Enter “ und „ Return “ werden die Daten von „ editor “ an das Modell übergeben und der Editor geschlossen. Wenn es sich bei „ event “ um einen Tastenanschlag für „ Tab “ handelt, öffnet die Ansicht einen Editor für das nächste Element in der Ansicht. Ebenso öffnet die Ansicht bei einem Tastenanschlag für „ event “ für „ Backtab “ einen Editor für das vorherige Element in der Ansicht.
Handelt es sich bei dem Ereignis um einen Tastendruck auf „ Esc “, wird der „ editor “ geschlossen, ohne dass seine Daten übernommen werden.
Diese Funktion wurde in Qt 6.10 eingeführt.
Siehe auch „ commitData()“ und „ closeEditor()“.
[virtual] bool QAbstractItemDelegate::helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index)
Immer wenn ein Hilfeereignis auftritt, wird diese Funktion mit dem event, dem view, dem option und dem index aufgerufen, der dem Element entspricht, bei dem das Ereignis auftritt.
Gibt „ true “ zurück, wenn der Delegat das Ereignis verarbeiten kann; andernfalls wird „ false “ zurückgegeben. Ein Rückgabewert von „true“ zeigt an, dass die mithilfe des Indexs abgerufenen Daten die erforderliche Rolle hatten.
Bei erfolgreich verarbeiteten Ereignissen vom Typ „ QEvent::ToolTip “ und „ QEvent::WhatsThis “ wird je nach Systemkonfiguration des Benutzers möglicherweise das entsprechende Popup-Fenster angezeigt.
Siehe auch „ QHelpEvent “.
[pure virtual] void QAbstractItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
Diese rein abstrakte Funktion muss neu implementiert werden, wenn Sie eine benutzerdefinierte Darstellung bereitstellen möchten. Verwenden Sie die Methode „ painter “ und die Eigenschaft „ option “, um das durch die Eigenschaft „ index “ angegebene Element darzustellen.
Wenn Sie diese Funktion neu implementieren, müssen Sie auch die Methode „ sizeHint()“ neu implementieren.
[virtual] void QAbstractItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
Setzt den Inhalt des angegebenen ` editor ` auf die Daten für das Element unter der angegebenen ` index`. Beachten Sie, dass der Index Informationen über das verwendete Modell enthält.
Die Basisimplementierung führt keine Aktion aus. Wenn Sie eine benutzerdefinierte Bearbeitung wünschen, müssen Sie diese Funktion neu implementieren.
Siehe auch setModelData().
[virtual] void QAbstractItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
Setzt die Daten für das Element an der angegebenen Position ` index ` in der ` model ` auf den Inhalt der angegebenen ` editor` .
Die Basisimplementierung führt keine Aktion aus. Wenn Sie eine benutzerdefinierte Bearbeitung wünschen, müssen Sie diese Funktion neu implementieren.
Siehe auch setEditorData().
[pure virtual] QSize QAbstractItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
Diese rein abstrakte Funktion muss neu implementiert werden, wenn Sie eine benutzerdefinierte Darstellung bereitstellen möchten. Die Optionen werden über ` option ` und das Modellelement über ` index` festgelegt.
Wenn Sie diese Funktion neu implementieren, müssen Sie auch ` paint()` neu implementieren.
[signal] void QAbstractItemDelegate::sizeHintChanged(const QModelIndex &index)
Dieses Signal muss ausgelöst werden, wenn sich die Funktion „ sizeHint()“ von „ index “ ändert.
Ansichten verbinden sich automatisch mit diesem Signal und passen die Anordnung der Elemente bei Bedarf an.
[virtual] void QAbstractItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
Aktualisiert die Geometrie des „ editor “ für das Element mit dem angegebenen „ index “ entsprechend dem in „ option “ angegebenen Rechteck. Verfügt das Element über ein internes Layout, wird der Editor entsprechend angeordnet. Beachten Sie, dass der Index Informationen über das verwendete Modell enthält.
Die Basisimplementierung führt keine Aktion aus. Wenn Sie eine benutzerdefinierte Bearbeitung wünschen, müssen Sie diese Funktion neu implementieren.
© 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.