QStyledItemDelegate解析

文章目录

  • QStyledItemDelegate Class
  • Detailed Description
  • Subclassing QStyledItemDelegate
  • QStyleditemDelegate vs. QItemDelegate

QStyledItemDelegate Class

QStyledItemDelegate类提供了模型中数据项目显示和编辑的工具

Detailed Description

QStyledItemDelegate类提供了模型中数据项目显示和编辑的工具。
当在视图中显示模型的数据时,比如在QTableView中,个体项目是由一个代理来绘制的,并且当一个项目在编辑的时候,它提供了一个编辑的窗体,当编辑发生的时候会将这个编辑窗体放在视图的顶层上。QStyledItemDelegate是所有的Qt的项目视图的默认的代理,并且在他们创建的时候就安装在上面了。
QStyledItemDelegate类是Qt的模型视图架构中的一个模型/视图类。代理允许项目的编辑和显示可以在模型和视图中独立的开发。
模型中的数据被指派了一个ItemDataRole,每一个role都储存着一个QVariant,QStyledItemDelegate实现了大多数的普通的数据类型的编辑和显示的功能,包括布尔型,整型,字符串。
数据会根据模型中的role的不同来分别绘制,下表描述了代理可以操控的每一个项目的role和数据类型,这些通常足够确定模型为每一个项目返回适当的数据,来确定项目在视图中的外观。

Role AcceptedTypes
Qt::BackgroundRole QBrush
Qt::BackgroundColorRole QColor(废弃了,现在使用Qt::BackgroundRole来代替)
Qt::CheckStateRole Qt::CheckState
Qt::DecorationRole QIcon, QPixmap, QImage和QColor
Qt::DisplayRole QString和其他的字符串类型
Qt::EditRole 详细的看QItemEditorFactory
Qt::FontRole QFont
Qt::SizeHintRole QSize
Qt::TextAlignmentRole Qt::Alignment
Qt::ForegroundRole QBrush
Qt::TextColorRole QColor(废弃了,现在使用Qt::ForegroundRole代替)

编辑器是由一个QItemEditorFactory来创建的,默认的静态实现是由QItemEditorFactory提供的,然后安装在所有的项目代理上,你可以使用setItemEditorFactory()函数来定制factory,或者使用QItemEditorFactory::setDefaultFactory()来设定新的默认factory,是带着EditRole的可编辑的储存在项目模型的数据,详细的可以QItemEditorFactory类来看项目编辑器的高级介绍,范例 Color Editor Factory展示了如何使用一个factory来创建定制的编辑器。

Subclassing QStyledItemDelegate

如果代理无法支持此数据类型的绘制,或者你需要或想去定制项目的绘制,你需要从QStyledItemDelegate中派生子类,并且重写函数paint(),有可能需要重写sizeHint(),函数paint()会在没有项目中单独调用,并且在函数sizeHint()的帮助下,你可以指定每一个项目的提示。
当重写函数paint()时,人们通常会处理希望绘制的数据类型,并为其他类型使用超类实现。
checkbox指示器的绘制是由当前的style所执行的,这个style也为不同的data roles指定了尺寸和环绕的矩形的绘制,边框的正方体同样也是由style来计算的,当绘制已经支持数据类型时,这里有一个好的方式来询问这些矩形边框的style,QStyle类描述了更多的细节。
如果你希望改变任何由style或chack box指示器的绘绘制所计算的边框矩形,你可以派生QStyle的子类,需要注意的是,无论如何,项目的大小也受重实现的函数sizeHint()所影响。
定制委托不使用editor item factory来提供编辑器对于定制委托来说,也是可能的,这种情况下,下面的虚函数需要重实现。

  • createEditor(),这个函数返回一个窗体,此窗体用来改变模型中的数据,可以重实现成定制的编辑表现
  • setEditorData(),这个函数返回一个窗体,这个窗体包含需要操纵的数据
  • updateEditorGeometry(),这个函数确保编辑正确显示项目视图
  • setModelData(),此函数返回给模型更新的数据

范例Star Delegate 给了一个重实现上面函数的范例

QStyleditemDelegate vs. QItemDelegate

从Qt 4.4开始,有两个代理类,QItemDelegate和QStyleItemDelegate,然而,默认的代理是QStyledItmDeleagte,这两个类是给视图中的项目提供绘制和编辑的独立的行为,这两个的不同之处是QStyledItemDelegate使用当前的style来绘制项目,因此我们建议使用QStyledItemDelegate作为基类,当实现定制的代理或在Qt style列表中,除非定制的委托需要使用style来绘制,否则这两个类的代码需要相同。
如果你希望定制项目视图的绘制,你需要实现一个定制的style,请看QStyle类文档

你可能感兴趣的:(Qt)