QAbstractItemDelegate Class

Die Klasse QAbstractItemDelegate wird verwendet, um Datenelemente eines Modells anzuzeigen und zu bearbeiten. Mehr...

Kopfzeile: #include <QAbstractItemDelegate>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
Vererbt: QObject
Vererbt von:

QItemDelegate und QStyledItemDelegate

Ö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)
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)

Detaillierte Beschreibung

Ein QAbstractItemDelegate stellt die Schnittstelle und die gemeinsame Funktionalität für Delegates in der Model/View-Architektur bereit. Delegates zeigen einzelne Elemente in Ansichten an und bearbeiten Modelldaten.

Die Klasse QAbstractItemDelegate gehört zu den Model/View-Klassen und ist Teil des Model/View-Frameworks von Qt.

Um ein Element auf eine benutzerdefinierte Weise darzustellen, müssen Sie paint() und sizeHint() implementieren. Die Klasse QStyledItemDelegate bietet Standardimplementierungen für diese Funktionen; wenn Sie kein benutzerdefiniertes Rendering benötigen, sollten Sie stattdessen diese Klasse unterklassifizieren.

Wir geben ein Beispiel für das Zeichnen eines Fortschrittsbalkens in Elementen; in unserem Fall für ein Paketverwaltungsprogramm.

Wir erstellen die Klasse WidgetDelegate, die von QStyledItemDelegate erbt. Das Zeichnen erfolgt mit 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 eine QStyleOptionProgressBar verwenden und ihre Mitglieder initialisieren. Anschließend können wir die aktuelle QStyle verwenden, um sie 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 createEditor() neu implementieren, um ein Editor-Widget bereitzustellen, setEditorData(), um den Editor mit den Daten aus dem Modell zu füllen, und setModelData(), damit der Delegat das Modell mit Daten aus dem Editor aktualisieren kann.

Der zweite Ansatz besteht darin, Benutzerereignisse direkt zu behandeln, indem editorEvent() neu implementiert wird.

Siehe auch Model/View Programmierung, QStyledItemDelegate und QStyle.

Dokumentation der Mitgliedstypen

enum QAbstractItemDelegate::EndEditHint

Diese Aufzählung beschreibt die verschiedenen Hinweise, die der Delegierte den Modell- und Ansichtskomponenten geben kann, um die Bearbeitung von Daten in einem Modell für den Benutzer angenehm zu gestalten.

KonstanteWertBeschreibung
QAbstractItemDelegate::NoHint0Es gibt keine empfohlene Aktion, die ausgeführt werden sollte.

Mit diesen Hinweisen kann der Delegierte das Verhalten der Ansicht beeinflussen:

KonstanteWertBeschreibung
QAbstractItemDelegate::EditNextItem1Die Ansicht sollte den Delegaten verwenden, um einen Editor für das nächste Element in der Ansicht zu öffnen.
QAbstractItemDelegate::EditPreviousItem2Die Ansicht sollte den Delegierten verwenden, um einen Editor für das vorherige Element in der Ansicht zu öffnen.

Beachten Sie, dass benutzerdefinierte Ansichten die Konzepte von next und previous unterschiedlich interpretieren können.

Die folgenden Hinweise sind sehr nützlich, wenn Modelle verwendet werden, die Daten zwischenspeichern, wie diejenigen, die Daten lokal manipulieren, um die Leistung zu erhöhen oder die Netzwerkbandbreite zu sparen.

KonstanteWertBeschreibung
QAbstractItemDelegate::SubmitModelCache3Wenn das Modell Daten zwischenspeichert, sollte es die zwischengespeicherten Daten in den zugrunde liegenden Datenspeicher schreiben.
QAbstractItemDelegate::RevertModelCache4Wenn das Modell Daten zwischenspeichert, sollte es die zwischengespeicherten Daten verwerfen und durch Daten aus dem zugrunde liegenden Datenspeicher ersetzen.

Obwohl Modelle und Sichten auf diese Hinweise in geeigneter Weise reagieren sollten, können benutzerdefinierte Komponenten einige oder alle von ihnen ignorieren, wenn sie nicht relevant sind.

Dokumentation der Mitgliedsfunktionen

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

Erzeugt einen neuen abstrakten Elementdelegaten mit dem angegebenen parent.

[virtual noexcept] QAbstractItemDelegate::~QAbstractItemDelegate()

Zerstört den abstrakten Elementdelegaten.

[signal] void QAbstractItemDelegate::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint)

Dieses Signal wird ausgegeben, wenn der Benutzer die Bearbeitung eines Elements unter Verwendung des angegebenen editor abgeschlossen hat.

Mit hint kann der Delegierte beeinflussen, wie sich das Modell und die Ansicht nach Abschluss der Bearbeitung verhalten. Es zeigt diesen Komponenten an, welche Aktion als nächstes ausgeführt werden sollte, um dem Benutzer eine komfortable Bearbeitung zu ermöglichen. Wenn z.B. EditNextItem angegeben ist, sollte die Ansicht einen Delegaten verwenden, um einen Editor für das nächste Element im Modell zu öffnen.

Siehe auch EndEditHint.

[signal] void QAbstractItemDelegate::commitData(QWidget *editor)

Dieses Signal muss ausgegeben werden, wenn das Widget editor die Bearbeitung der Daten abgeschlossen hat und sie zurück in das Modell schreiben möchte.

[virtual] QWidget *QAbstractItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const

Gibt den Editor zurück, der für die Bearbeitung 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 und die Elementoptionen durch option angegeben.

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 Qt::StrongFocus haben; andernfalls werden QMouseEvents, die vom Widget empfangen werden, auf die Ansicht übertragen. Der Hintergrund der Ansicht wird durchscheinen, es sei denn der Editor malt 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 editor nicht mehr für die Bearbeitung des Datenelements mit der angegebenen index benötigt wird und zerstört werden soll. Das Standardverhalten ist ein Aufruf von deleteLater im Editor. Es ist z.B. möglich, dieses Löschen 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 der event, die die Bearbeitung ausgelöst hat, der model, der index des Elements und der option, die für das Rendern des Elements verwendet wird, aufgerufen.

Mausereignisse werden an editorEvent() gesendet, auch wenn sie nicht die Bearbeitung des Eintrags auslösen. Dies kann z.B. nützlich sein, wenn Sie ein Kontextmenü öffnen wollen, wenn die rechte Maustaste auf einem Element gedrückt wird.

Die Basisimplementierung gibt false zurück (was bedeutet, dass sie das Ereignis nicht behandelt hat).

[virtual] bool QAbstractItemDelegate::helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index)

Immer wenn ein Hilfe-Ereignis eintritt, wird diese Funktion mit dem event view option und dem index aufgerufen, der dem Element entspricht, bei dem das Ereignis eintritt.

Gibt true zurück, wenn der Delegierte das Ereignis behandeln kann; andernfalls wird false zurückgegeben. Ein Rückgabewert von true zeigt an, dass die über den Index erhaltenen Daten die erforderliche Rolle hatten.

Bei den Ereignissen QEvent::ToolTip und QEvent::WhatsThis, die erfolgreich behandelt wurden, kann je nach Systemkonfiguration des Benutzers das entsprechende Popup angezeigt werden.

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 ein benutzerdefiniertes Rendering anbieten möchten. Verwenden Sie painter und den Stil option, um das durch das Element index angegebene Element darzustellen.

Wenn Sie dies neu implementieren, müssen Sie auch 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 dem angegebenen index. Beachten Sie, dass der Index Informationen über das verwendete Modell enthält.

Die Basisimplementierung tut nichts. 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 unter dem angegebenen index in model auf den Inhalt des angegebenen editor.

Die Basisimplementierung tut nichts. Wenn Sie eine eigene 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 ein benutzerdefiniertes Rendering anbieten möchten. Die Optionen werden durch option und das Modellelement durch 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 ausgegeben werden, wenn sich die sizeHint() von index ändert.

Ansichten stellen automatisch eine Verbindung zu diesem Signal her und geben bei Bedarf Elemente weiter.

[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. Wenn das Element ein internes Layout hat, wird der Editor entsprechend gestaltet. Beachten Sie, dass der Index Informationen über das verwendete Modell enthält.

Die Basisimplementierung tut nichts. Wenn Sie eine individuelle Bearbeitung wünschen, müssen Sie diese Funktion neu implementieren.

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