QAbstractItemDelegate Class
QAbstractItemDelegate 类用于显示和编辑来自模型的数据项。更多内容...
| 头文件: | #include <QAbstractItemDelegate> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| 继承自: | QObject |
| 继承自: |
公共类型
| enum | EndEditHint { NoHint, EditNextItem, EditPreviousItem, SubmitModelCache, RevertModelCache } |
公共函数
| 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 |
信号
| void | closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint) |
| void | commitData(QWidget *editor) |
| void | sizeHintChanged(const QModelIndex &index) |
详细说明
QAbstractItemDelegate 为模型/视图架构中的委托提供了接口和通用功能。委托在视图中显示单个项目,并处理模型数据的编辑。
QAbstractItemDelegate 类是模型/视图类之一,属于 Qt的模型/视图框架。
若要以自定义方式渲染项目,必须实现paint()和sizeHint()。QStyledItemDelegate 类为这些函数提供了默认实现;若无需自定义渲染,请直接继承该类。
下面我们以绘制进度条为例,说明在 items 中实现该功能;本例中用于一个包管理程序。

我们创建了继承自QStyledItemDelegate 的WidgetDelegate 类。我们在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);请注意,我们使用QStyleOptionProgressBar 并初始化其成员。然后,我们可以使用当前的QStyle 来绘制它。
要实现自定义编辑功能,可以使用两种方法。 第一种方法是创建一个编辑器控件,并将其直接显示在项目上方。为此,您必须重写createEditor() 方法以提供编辑器控件,重写setEditorData() 方法以将模型中的数据填充到编辑器中,并重写setModelData() 方法,以便委托能够使用编辑器中的数据更新模型。
第二种方法是通过重写 `editorEvent()` 来直接处理用户事件。
另请参阅 “模型/视图编程”、“QStyledItemDelegate ”以及“QStyle ”。
成员类型文档
enum QAbstractItemDelegate::EndEditHint
该枚举描述了委托可以向模型和视图组件提供的各种提示,以使用户在模型中编辑数据时获得舒适的体验。
| 常量 | 值 | 描述 |
|---|---|---|
QAbstractItemDelegate::NoHint | 0 | 没有建议执行的操作。 |
这些提示使委托能够影响视图的行为:
| 常量 | 值 | 描述 |
|---|---|---|
QAbstractItemDelegate::EditNextItem | 1 | 视图应使用委托在视图中的下一个项目上打开编辑器。 |
QAbstractItemDelegate::EditPreviousItem | 2 | 视图应使用委托在视图中的上一个项目上打开编辑器。 |
请注意,自定义视图对“下一个”和“上一个”的概念可能有不同的解释。
当使用缓存数据的模型时(例如,为了提高性能或节省网络带宽而在本地操作数据的模型),以下提示最为有用。
| 常量 | 值 | 描述 |
|---|---|---|
QAbstractItemDelegate::SubmitModelCache | 3 | 如果模型缓存了数据,则应将缓存的数据写入底层数据存储。 |
QAbstractItemDelegate::RevertModelCache | 4 | 如果模型缓存了数据,则应丢弃缓存的数据,并用底层数据存储中的数据替换它。 |
虽然模型和视图应以适当的方式响应这些提示,但如果这些提示与自定义组件无关,则该组件可以忽略其中任何一个或所有提示。
成员函数文档
[explicit] QAbstractItemDelegate::QAbstractItemDelegate(QObject *parent = nullptr)
使用给定的parent 创建一个新的抽象项目委托。
[virtual noexcept] QAbstractItemDelegate::~QAbstractItemDelegate()
销毁该抽象项的委托对象。
[signal] void QAbstractItemDelegate::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint)
当用户使用指定的editor 完成对某项的编辑时,会触发此信号。
hint 为委托提供了一种方式,使其能够影响编辑完成后模型和视图的行为。它向这些组件指示接下来应执行什么操作,以向用户提供舒适的编辑体验。例如,如果指定了EditNextItem ,视图应使用委托在模型中的下一个项目上打开编辑器。
另请参阅 EndEditHint 。
[signal] void QAbstractItemDelegate::commitData(QWidget *editor)
当editor 控件完成数据编辑并希望将数据写回模型时,必须发出此信号。
[virtual] QWidget *QAbstractItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
返回用于编辑具有给定index 的数据项的编辑器。请注意,该索引包含有关所用模型的信息。编辑器的父控件由parent 指定,而项选项由option 指定。
基类实现返回nullptr 。若需自定义编辑功能,则需重写此函数。
返回的编辑器控件应具有Qt::StrongFocus 属性;否则,该控件接收的QMouseEvent事件将传播到视图。除非编辑器绘制自己的背景(例如,使用setAutoFillBackground()),否则视图的背景将透出来。
另请参阅 destroyEditor()、setModelData() 和setEditorData()。
[virtual] void QAbstractItemDelegate::destroyEditor(QWidget *editor, const QModelIndex &index) const
当不再需要使用editor 来编辑具有给定index 的数据项,且应将其销毁时调用此函数。默认行为是调用编辑器的deleteLater方法。例如,可以通过重写此函数来避免此删除操作。
另请参阅 createEditor()。
[virtual] bool QAbstractItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
当开始编辑某项时,会调用此函数,并传入触发编辑的event 、model 、该项的index ,以及用于渲染该项的option 。
即使鼠标事件未触发项的编辑操作,这些事件仍会发送至 editorEvent()。例如,当在某项上按下鼠标右键时,若希望打开上下文菜单,此功能便十分有用。
基础实现会返回false (表示未处理该事件)。
[since 6.10] bool QAbstractItemDelegate::handleEditorEvent(QObject *editor, QEvent *event)
代表当前活动的editor 实现标准事件处理。请在QAbstractItemModel 子类中通过重写eventFilter()方法来调用此函数,并返回其结果。为避免事件处理重复,调用此函数后请勿再调用父类的eventFilter()方法。
如果给定的editor 是有效的QWidget ,且给定的event 已被处理,则返回true ;否则返回false 。默认情况下,以下按键事件会被处理:
- Tab
- Backtab
- Enter
- Return
- Esc
如果editor 的类型为QTextEdit 或QPlainTextEdit ,则不会处理Tab 、Backtab 、Enter 和Return 这几个键。
对于Tab 、Backtab 、Enter 和Return 按键事件,editor 的数据将提交至模型,且编辑器将关闭。如果event 触发的是Tab 按键事件,视图将在当前视图中的下一个项目上打开编辑器。同样,如果event 触发的是Backtab 按键事件,视图将在当前视图中的上一个项目上打开编辑器。
如果事件是Esc 按键事件,则editor 将被关闭,且其数据不会被提交。
该函数在 Qt 6.10 中引入。
另请参阅 commitData() 和closeEditor()。
[virtual] bool QAbstractItemDelegate::helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index)
每当发生帮助事件时,都会调用此函数,并传入event 、view 、option 以及与发生事件的项目相对应的index 。
如果委托能够处理该事件,则返回true ;否则返回false 。返回值为true表示使用该索引获取的数据具有所需的角色。
对于成功处理的QEvent::ToolTip 和QEvent::WhatsThis 事件,可能会根据用户的系统配置显示相应的弹出窗口。
另请参阅 QHelpEvent 。
[pure virtual] void QAbstractItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
若要提供自定义渲染,必须重写此纯抽象函数。使用 `painter ` 并为 `option ` 设置样式,以渲染由 `itemindex` 指定的项目。
如果重写了此方法,则必须同时重写 `sizeHint()` 方法。
[virtual] void QAbstractItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
将给定的editor 的内容设置为给定index 处项的数据。请注意,该索引包含有关所用模型的信息。
基类实现不执行任何操作。若需自定义编辑功能,则需重写此函数。
另请参阅 setModelData()。
[virtual] void QAbstractItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
将model 中位于给定index 位置的项目数据设置为给定editor 中的内容。
基类实现不执行任何操作。若需自定义编辑功能,则需重写此函数。
另请参阅 setEditorData()。
[pure virtual] QSize QAbstractItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
若要提供自定义渲染,必须重写此纯抽象函数。选项由option 指定,模型项由index 指定。
如果重写了该函数,则必须同时重写paint()。
[signal] void QAbstractItemDelegate::sizeHintChanged(const QModelIndex &index)
当index 的sizeHint()发生变化时,必须触发此信号。
视图会自动连接到此信号,并在必要时重新布局项目。
[virtual] void QAbstractItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
根据option 中指定的矩形,更新具有给定index 的项的editor 几何形状。如果该项具有内部布局,编辑器将据此进行布局。请注意,索引包含有关所用模型的信息。
基类实现不执行任何操作。若需自定义编辑功能,必须重写此函数。
© 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.