QStyledItemDelegate 类

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

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

QSqlRelationalDelegate

公共函数

QStyledItemDelegate(QObject *parent = nullptr)
virtual~QStyledItemDelegate()
virtual QStringdisplayText(const QVariant &value, const QLocale &locale) const
QItemEditorFactory *itemEditorFactory() const
voidsetItemEditorFactory(QItemEditorFactory *factory)

重写公共函数

virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
virtual voidpaint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
virtual voidsetEditorData(QWidget *editor, const QModelIndex &index) const override
virtual voidsetModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
virtual QSizesizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
virtual voidupdateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override

受保护的函数

virtual voidinitStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const

重写受保护的函数

virtual booleditorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override
virtual booleventFilter(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() 将更新后的数据返回到模型。

通过重新实现这些方法,星型委托 示例创建编辑器。

QStyledItemDelegate 与 QItemDelegate

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

如果您希望自定义项目视图的绘制,您应实现自定义样式。请参阅 QStyle 类文档以获取详细信息。

参见委托类QItemDelegateQAbstractItemDelegateQStyle星型委托示例

成员函数文档

[显式] QStyledItemDelegate::QStyledItemDelegate(QObject *parent = nullptr)

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

[虚 无异常] QStyledItemDelegate::~QStyledItemDelegate()

销毁项目委托。

[重载虚] QWidget *QStyledItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const

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

返回用于编辑由 index 指定项目的控件,用于编辑。控件 parent 和样式 option 用于控制编辑器控件的外观。

参见QAbstractItemDelegate::createEditor

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

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

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

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

另请参阅 QAbstractItemModel::data

[重写虚受保护] bool QStyledItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)

重写: QAbstractItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &ldash;option, const QModelIndex &rdash;index)

[重写虚受保护] bool QStyledItemDelegate::eventFilter(QObject *editor, QEvent *event)

重写: QObject::eventFilter(QObject *watched, QEvent *event)

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

  • Tab
  • Backtab
  • Enter
  • Return
  • Esc

如果编辑器的类型是QTextEditQPlainTextEdit,则TabBacktabEnterReturn按键不被处理。

TabBacktabEnterReturn按键事件的情形下,编辑器的数据将提交给模型,并关闭编辑器。如果事件是Tab按键的按下,视图将在视图中下一个项目上打开编辑器。同样地,如果事件是Backtab按键的按下,视图将在视图中上一个项目上打开编辑器。

如果事件是Esc按键的按下事件,则编辑器关闭而不会提交其数据。

另请参阅 commitData()和closeEditor

[虚受保护] void QStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const

使用索引index的值初始化option。此方法对于子类很有用,当它们需要QStyleOptionViewItem但不想自己填写所有信息时。

另请参阅 QStyleOption::initFrom

QItemEditorFactory *QStyledItemDelegate::itemEditorFactory() const

返回项目代理使用的编辑器工厂。如果没有设置编辑器工厂,则函数将返回null。

另请参阅 setItemEditorFactory

[重写虚] 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 来绘制项目。

在子类中重写 paint。使用 initStyleOption() 来设置 option,与 QStyledItemDelegate 相同。

在可能的情况下,在绘制时使用 option。特别是其 rect 变量来确定绘制位置,以及其 state 来确定是否启用或选中。

绘制后,您应该确保绘图器返回到调用此函数时提供的状态。例如,在绘制之前调用 QPainter::save() 并绘制后调用 QPainter::restore() 可能很有用。

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

[覆盖虚函数] void QStyledItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const

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

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

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

另请参阅 QMetaProperty::isUser

void QStyledItemDelegate::setItemEditorFactory(QItemEditorFactory *factory)

设置项目代理要使用的编辑器工厂为指定的 factory。如果没有设置编辑器工厂,则项目代理将使用默认的编辑器工厂。

另请参阅 itemEditorFactory

[覆盖虚函数] void QStyledItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const

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

editor 小部件获取数据并将其存储在指定的 modelindex 所指的项目中。

默认实现从 editor 小部件的 用户属性 获取要存储的数据模型中的值。

另请参阅 QMetaProperty::isUser

[覆盖虚函数] QSize QStyledItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const

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

返回代理用于显示指定 index 的项目所需的大小,考虑了 option 提供的样式信息。

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

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

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

© 2024 Qt公司。此处包含的文档贡献版权属于各所有人。本处提供的文档是根据自由软件基金会发布的 GNU自由文档许可证版本1.3 的条款提供的。Qt及其相关标志在芬兰和其他国家和地区为Qt公司的商标。所有其他商标均为各自所有者的财产。