QStyledItemDelegate Class

QStyledItemDelegate 类为模型中的数据项提供显示和编辑功能。更多

Header: #include <QStyledItemDelegate>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
继承: QAbstractItemDelegate
继承于:

QSqlRelationalDelegate

公共函数

QStyledItemDelegate(QObject *parent = nullptr)
virtual ~QStyledItemDelegate()
virtual QString displayText(const QVariant &value, const QLocale &locale) const
QItemEditorFactory *itemEditorFactory() const
void setItemEditorFactory(QItemEditorFactory *factory)

重新实现的公共函数

virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
virtual void setEditorData(QWidget *editor, const QModelIndex &index) const override
virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override

保护函数

virtual void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const

重新实现的受保护函数

virtual bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override
virtual bool eventFilter(QObject *editor, QEvent *event) override

详细说明

当在 Qt 项目视图(如QTableView )中显示来自模型的数据时,单个项目由委托绘制。此外,当编辑一个项目时,它将提供一个编辑器窗口小部件,该窗口小部件将在编辑进行时放置在项目视图的顶部。QStyledItemDelegate 是所有 Qt 项目视图的默认委托,并在创建时安装在项目视图上。

QStyledItemDelegate 类是模型/视图类之一,是 Qt模型/视图框架的一部分。该委托允许独立于模型和视图开发项目的显示和编辑。

模型中项的数据被分配一个ItemDataRole ;每个项可以为每个角色存储一个QVariant 。QStyledItemDelegate 实现了用户期望的最常见数据类型的显示和编辑,包括布尔、整数和字符串。

数据的绘制方式将根据它们在模型中的角色而有所不同。下表描述了角色和委托可处理的数据类型。通常只需确保模型为每个角色返回适当的数据,即可确定视图中项的外观。

编辑器是通过QItemEditorFactory 创建的;由QItemEditorFactory 提供的默认静态实例安装在所有项目委托上。您可以使用setItemEditorFactory() 设置自定义工厂,或使用QItemEditorFactory::setDefaultFactory() 设置新的默认工厂。

QItemEditorFactory *editorFactory = new QItemEditorFactory;
QItemEditorCreatorBase *creator = new QStandardItemEditorCreator<MyFancyDateTimeEdit>();
editorFactory->registerEditor(QMetaType::QDateTime, creator);

QItemEditorFactory::setDefaultFactory(editorFactory);

设置新的工厂后,所有标准的项目委托都将使用它(即在设置新的默认工厂之前创建的委托)。

编辑的是存储在EditRole 的项目模型中的数据。有关项目编辑器工厂的更高层次介绍,请参阅QItemEditorFactory 类。

子类化 QStyledItemDelegate

如果委托不支持您需要的数据类型的绘制,或者您想自定义项的绘制,您需要子类化 QStyledItemDelegate,并重新实现paint() 和可能的sizeHint()。paint() 函数会为每个项目单独调用,通过sizeHint() 可以为每个项目指定提示。

在重新实现paint() 时,通常会处理想要绘制的数据类型,并使用超类实现其他类型。

复选框指示符的绘制由当前样式执行。样式还指定了为不同数据角色绘制数据的大小和边界矩形。项目本身的边界矩形也由样式计算。因此,在绘制已支持的数据类型时,最好向样式询问这些边界矩形。QStyle 类说明对此有更详细的描述。

如果希望更改由样式计算出的任何边界矩形或复选框指示符的绘制,可以子类化QStyle 。但请注意,也可以通过重新实现sizeHint() 来影响项的大小。

自定义委托可以在不使用编辑器项工厂的情况下提供编辑器。在这种情况下,必须重新实现以下虚拟函数:

  • createEditor() 返回用于更改模型数据的部件,可以重新实现以自定义编辑行为。
  • setEditorData() 为部件提供可操作的数据。
  • updateEditorGeometry() 确保编辑器相对于项目视图正确显示。
  • setModelData() 将更新后的数据返回给模型。

Star Delegate示例通过重新实现这些方法来创建编辑器。

QStyledItemDelegate 与 QItemDelegate 的比较

自 Qt 4.4 起,有两个委托类:QItemDelegate 和 QStyledItemDelegate。不过,默认委托是 QStyledItemDelegate。这两个类是为视图中的项目绘制和提供编辑器的独立替代类。它们之间的区别在于 QStyledItemDelegate 使用当前样式来绘制其项目。因此,我们建议在实现自定义委托或使用 Qt 样式表时使用 QStyledItemDelegate 作为基类。除非自定义委托需要使用样式进行绘制,否则这两个类所需的代码应该是相同的。

如果希望自定义项目视图的绘制,则应实现自定义样式。详情请参见QStyle 类文档。

另请参阅 委托类QItemDelegate,QAbstractItemDelegate,QStyle星形委托示例

成员函数文档

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

使用给定的parent 构建一个项目委托。

[virtual noexcept] QStyledItemDelegate::~QStyledItemDelegate()

销毁项目委托。

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

重实现:QAbstractItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const.

返回用于编辑index 所指定项目的 widget。parent widget 和样式option 用于控制编辑器 widget 的显示方式。

另请参阅 QAbstractItemDelegate::createEditor().

[virtual] QString QStyledItemDelegate::displayText(const QVariant &value, const QLocale &locale) const

此函数返回委托将用于在locale 中显示模型的Qt::DisplayRole 的字符串。value 是模型提供的Qt::DisplayRole 的值。

默认实现使用QLocale::toStringvalue 转换为QString

空模型索引(即模型返回无效QVariant 的索引)不会调用此函数。

另请参阅 QAbstractItemModel::data() 。

[override virtual protected] bool QStyledItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)

重实现:QAbstractItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index).

[override virtual protected] bool QStyledItemDelegate::eventFilter(QObject *editor, QEvent *event)

重实现:QObject::eventFilter(QObject *watched, QEvent *event)。

如果给定的editor 是有效的QWidget ,且给定的event 已处理,则返回true ;否则返回false 。默认处理以下按键事件:

  • Tab
  • Backtab
  • Enter
  • Return
  • Esc

如果editor 的类型是QTextEditQPlainTextEdit ,则处理Tab,Backtab,EnterReturn 按键。

对于Tab,Backtab,EnterReturn 按键事件,editor 的数据将保存到模型中,编辑器关闭。如果eventTab 按键,视图将打开视图中下一个项目的编辑器。同样,如果eventBacktab 按键,视图将打开视图中上一个项目的编辑器。

如果事件是Esc 按键按下事件,则editor 将关闭,不会提交数据。

另请参阅 commitData() 和closeEditor()。

[virtual protected] void QStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const

使用索引indexoption 的值初始化。当子类需要QStyleOptionViewItem ,但又不想自己填写所有信息时,该方法非常有用。

另请参阅 QStyleOption::initFrom()。

QItemEditorFactory *QStyledItemDelegate::itemEditorFactory() const

返回项目委托所使用的编辑器工厂。如果未设置编辑器工厂,函数将返回 null。

另请参见 setItemEditorFactory()。

[override virtual] void QStyledItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const

重实现:QAbstractItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const.

使用给定的painter 和样式optionindex 指定的项目渲染委托。

该函数使用视图的QStyle 绘制项目。

在子类中重新实现绘制时。使用initStyleOption() 设置option 的方式与QStyledItemDelegate 相同。

尽可能在绘制时使用option 。尤其是它的rect 变量来决定绘制的位置,以及它的state 来确定是否启用或选中。

绘制完成后,应确保绘制器返回到调用此函数时的状态。例如,在绘制前调用QPainter::save() 和在绘制后调用QPainter::restore() 可能会有帮助。

另请参阅 QItemDelegate::paint()、QStyle::drawControl() 和QStyle::CE_ItemViewItem

[override virtual] void QStyledItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const

重实现:QAbstractItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const.

从模型index 指定的数据模型项中设置editor 要显示和编辑的数据。

默认实现将数据存储在editor widget 的用户属性中。

另请参阅 QMetaProperty::isUser().

void QStyledItemDelegate::setItemEditorFactory(QItemEditorFactory *factory)

将项目委托使用的编辑器工厂设置为指定的factory 。如果未设置编辑器工厂,项目委托将使用默认编辑器工厂。

另请参阅 itemEditorFactory().

[override virtual] void QStyledItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const

重实现:QAbstractItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const.

editor widget 获取数据并存储到指定的model 项目index 中。

默认实现是从editor widget 的用户属性中获取要存储在数据模型中的值。

另请参阅 QMetaProperty::isUser() 。

[override virtual] QSize QStyledItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const

重实现:QAbstractItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) 常量。

返回委托显示index 指定的项目所需的大小,同时考虑option 提供的样式信息。

此函数使用视图的QStyle 来确定项目的大小。

另请参阅 QStyle::sizeFromContents() 和QStyle::CT_ItemViewItem

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

重实现:QAbstractItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const.

根据给定的样式option 更新index 指定的项目的editor

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