QAbstractItemDelegate 类

QAbstractItemDelegate 类用于显示和编辑来自模型的数据项。 更多...

头文件 #include <QAbstractItemDelegate>
CMakefind_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmakeQT += widgets
继承自 QObject
被以下类继承

QItemDelegateQStyledItemDelegate

公共类型

枚举EndEditHint { 无提示, 编辑下一个项, 编辑上一个项, 提交模型缓存, 撤销模型缓存 }

公共函数

QAbstractItemDelegate(QObject *parent = nullptr)
virtual~QAbstractItemDelegate()
virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
virtual voiddestroyEditor(QWidget *editor, const QModelIndex &index) const
virtual booleditorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
virtual boolhelpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index)
virtual voidpaint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const = 0
virtual voidsetEditorData(QWidget *editor, const QModelIndex &index) const
virtual voidsetModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
virtual QSizesizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const = 0
virtual voidupdateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const

信号

voidcloseEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint)
voidcommitData(QWidget *editor)
voidsizeHintChanged(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() 来处理用户事件。

另请参阅 模型/视图编程QStyledItemDelegateQStyle

成员类型文档

enum QAbstractItemDelegate::EndEditHint

此枚举描述了委托可以提供给模型和视图组件的不同提示,以使编辑模型中的数据对用户来说是一个舒适的体验。

常量描述
QAbstractItemDelegate::NoHint0没有推荐执行的操作。

这些提示允许委托影响视图的行为

常量描述
QAbstractItemDelegate::EditNextItem1视图应该使用委托在视图中打开下一个项目的编辑器。
QAbstractItemDelegate::EditPreviousItem2视图应该使用委托在视图中打开上一个项目的编辑器。

请注意,自定义视图可能对“下一个”和“上一个”概念有不同的解释。

以下提示在模型使用缓存数据时最有用,例如那些为了提高性能或节省网络带宽而在本地操作数据的数据。

常量描述
QAbstractItemDelegate::SubmitModelCache3如果模型缓存数据,它应该将缓存的写入到基本数据存储。
QAbstractItemDelegate::RevertModelCache4如果模型缓存数据,它应该丢弃缓存的并替换为来自基本数据存储的数据。

尽管模型和视图应该以适当的方式对这些提示做出响应,但如果它们不相关,则自定义组件可以忽略任何或全部提示。

成员函数文档

[显式] 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()),否则视图的背景将发光。

另请参阅destroyEditorsetModelDatasetEditorData

[虚函数] 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)

在开始编辑项时,此函数将使用触发的编辑的 eventmodel,项的 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::ToolTipQEvent::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)

indexsizeHint () 发生更改时,必须发出此信号。

视图会自动连接到该信号,并在必要时重新布局项目。

[virtual] void QAbstractItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const

根据 option 中指定的矩形更新具有给定 indexeditor 的几何形状。如果项目有内部布局,则编辑器将相应地进行布局。请注意,索引包含有关所使用的模型的信息。

基本实现不执行任何操作。如果您想要自定义编辑,必须重写此函数。

© 2024 The Qt Company Ltd. 此处包含的文档贡献的版权归各自的主人所有。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款许可的。Qt 和相应的商标是 The Qt Company Ltd. 在芬兰和其他国家/地区的商标。所有其他商标均为其各自主人的财产。