QAbstractItemDelegate 类
QAbstractItemDelegate 类用于显示和编辑来自模型的数据项。 更多...
头文件 | #include <QAbstractItemDelegate> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
qmake | QT += widgets |
继承自 | QObject |
被以下类继承 |
公共类型
枚举 | EndEditHint { 无提示, 编辑下一个项, 编辑上一个项, 提交模型缓存, 撤销模型缓存 } |
公共函数
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 |
信号
void | closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint) |
void | commitData(QWidget *editor) |
void | sizeHintChanged(const QModelIndex &index) |
详细描述
QAbstractItemDelegate 提供了模型/视图架构中代理接口和常用功能。代理在视图中显示单个项,并处理模型数据的编辑。
The QAbstractItemDelegate 类是 模型/视图类 之一,也是 Qt 的 模型/视图框架 的一个部分。
为了以自定义方式渲染项目,您必须实现 paint() 和 sizeHint()。 QStyledItemDelegate 类提供了这些函数的默认实现;如果您不需要自定义渲染,则可以使用该类作为子类。
我们给出在项目中绘制进度条的示例;在我们的案例中是为了包管理程序。
我们创建了一个从 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 | 如果模型缓存数据,它应该丢弃缓存的并替换为来自基本数据存储的数据。 |
尽管模型和视图应该以适当的方式对这些提示做出响应,但如果它们不相关,则自定义组件可以忽略任何或全部提示。
成员函数文档
[显式]
QAbstractItemDelegate::QAbstractItemDelegate(QObject *parent = nullptr)
创建一个具有给定 parent 的新抽象项目代理。
[虚拟 noexcept]
QAbstractItemDelegate::~QAbstractItemDelegate()
销毁抽象项代理。
[信号]
void QAbstractItemDelegate::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint)
当用户使用指定的 editor 完成编辑项目时,此信号会被发出。
hint 为代理提供了一个影响模型和视图编辑完成后行为的方式。它指示了这些组件接下来应该执行什么操作,以提供给用户舒适的编辑体验。例如,如果指定了 EditNextItem
,视图应通过代理打开模型中下一项的编辑器。
另请参阅EndEditHint。
[信号]
void QAbstractItemDelegate::commitData(QWidget *editor)
当 editor 小部件完成数据编辑并将它写回模型时,必须发出此信号。
[虚函数]
QWidget *QAbstractItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
返回用于编辑给定 index 数据项的编辑器。注意,索引包含有关正在使用的模型的信息。编辑器的父小部件由 parent 指定,项选项由 option 指定。
基本实现返回 nullptr
。如果您需要自定义编辑,则需要重新实现此函数。
返回的编辑器小部件应具有 Qt::StrongFocus;否则,小部件收到的 QMouseEvent 将传播到视图。除非编辑器绘制自己的背景(例如,使用 setAutoFillBackground()),否则视图的背景将发光。
另请参阅destroyEditor,setModelData 和 setEditorData。
[虚函数]
void QAbstractItemDelegate::destroyEditor(QWidget *editor, const QModelIndex &index) const
当不再需要用于编辑给定 index 数据项的 editor 进行编辑时,此函数将被调用以销毁它。默认行为是对编辑器调用 deleteLater。例如,通过重新实现此函数可以避免此删除。
另请参阅createEditor。
[虚函数]
bool QAbstractItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
在开始编辑项时,此函数将使用触发的编辑的 event,model,项的 index 和用于渲染项的 option 调用。
即使事件没有开始编辑项,鼠标事件也会发送到editorEvent()。例如,当您在项上按下鼠标右键时打开上下文菜单时,这可能会很有用。
基本实现返回false
(表示它没有处理事件)。
[虚拟]
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。
[纯虚拟]
void QAbstractItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
如果您想自定义渲染,则需要重新实现此纯抽象函数。使用painter
和风格option
来渲染由项索引确定的项。
如果您重新实现了此方法,还必须重新实现sizeHint。
[虚拟]
void QAbstractItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
将给定editor
的内容设置为给定index
处项的数据。请注意,索引包含有关使用中的模型的信息。
基本实现不执行任何操作。如果您想自定义编辑,则需要重新实现此函数。
另请参阅setModelData。
[虚拟]
void QAbstractItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
将model
中给定index
处的项的数据设置为给定editor
的内容。
基本实现不执行任何操作。如果您想自定义编辑,则需要重新实现此函数。
另请参阅setEditorData。
[纯虚拟]
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 的几何形状。如果项目有内部布局,则编辑器将相应地进行布局。请注意,索引包含有关所使用的模型的信息。
基本实现不执行任何操作。如果您想要自定义编辑,必须重写此函数。
© 2024 The Qt Company Ltd. 此处包含的文档贡献的版权归各自的主人所有。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款许可的。Qt 和相应的商标是 The Qt Company Ltd. 在芬兰和其他国家/地区的商标。所有其他商标均为其各自主人的财产。