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: |
Ö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.
Konstante | Wert | Beschreibung |
---|---|---|
QAbstractItemDelegate::NoHint | 0 | Es gibt keine empfohlene Aktion, die ausgeführt werden sollte. |
Mit diesen Hinweisen kann der Delegierte 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 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.
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 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.