QStyledItemDelegate类为来自模型的数据项提供了显示和编辑工具。

当在Qt项视图(例如QTableView)中显示来自模型的数据时,各个项由委托(delegate)绘制。此外,当编辑一个项目时,它提供一个编辑器小部件,当编辑发生时,该小部件放在项目视图的顶部。QStyledItemDelegate是所有Qt项视图的默认委托,在创建时安装在它们上。 QStyledItemDelegate类是模型/视图类之一,是Qt模型/视图框架的一部分。委托允许独立于模型和视图开发项目的显示和编辑。

项目的数据在模型中被分配一个ItemDataRole;每个项目可以为每个角色存储QVariant。QStyledItemDelegate实现显示和编辑用户所期望的最常见的数据类型,包括布尔值、整数、字符串。根据数据在模型中所扮演的角色,数据的绘制将会有所不同。通常需要确保模型为每个角色返回适当的数据,以确定视图中的项的外观。

这里有以下几个要点要记住:

1.QStyledItemDelegate是专门用于项的(item)的视图委托!不能作为其他非项的委托使用。

2.委托用于实现个性化设置的项显示,他的数据来源于模型(model),控制view显示的方式。

3.QStyledItemDelegate是作为默认项委托使用的。如果不独立实现并制定项的委托,则在自定义view和自定义的model中使用默认的委托(delegate)。

4.使用默认委托时,从模型中读取的数据都是按照默认规则来的。默认规则就是通过itemDataRole角色标志的数据在view中显示的。因此需要在model中未每个定义的角色返回合适的数据,这样在使用默认委托时才能显示出自己想要的效果。当然,如果想要其他个性化效果最好是使用自定义的委托。

模型中角色可接受的数据类型

角色描述  角色  可接受的数据类型
用于呈现的项目的背景刷(使用默认委托)  Qt::BackgroundRole  QBrush
这个角色已经过时了。使用BackgroundRole  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
这个角色已经过时了。使用ForegroundRol  Qt::TextColorRole  QColor (不再推荐; 可以使用 Qt::ForegroundRole 替代这个角色)

这里注意一下几点:

1.角色的数据大多数在默认委托中有专门的用途(在view中什么以model的什么数据呈现)

2.对于Qt::EditRole我们要特别注意,编辑器是悬浮在item上的一个特别的可编辑按钮,他不属于view视图本身:

编辑器是用QItemEditorFactory创建的;QItemEditorFactory提供的默认静态实例安装在所有项委托上。您可以使用setItemEditorFactory()设置自定义工厂,或者使用QItemEditorFactory::setDefaultFactory()设置一个新的默认工厂。使用编辑的EditRole存储在项目模型中的数据。请参阅QItemEditorFactory类,了解项目编辑器工厂的更高级介绍。

使用QStyledItemDelegate的子类实现自定义项的委托

如果委托不支持绘制所需的数据类型,或者希望定制项目的绘制,则需要子类化QStyledItemDelegate,并重新实现paint()和sizeHint()。paint()函数为每个项目分别调用,使用sizeHint(),可以为每个项目指定提示。

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

复选框指示符的绘制按当前样式执行。样式还指定用于绘制不同数据角色的数据的大小和边框。项目本身的边框也由样式计算。当绘制已经支持的数据类型时,最好询问这些边框的样式。QStyle类描述更详细地描述了这一点。

如果您希望更改按样式或复选框指示符绘制的任何边框,您可以对QStyle进行子类化。但是,请注意,重新实现sizeHint()也会影响项目的大小。

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

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

注意:从Qt 4.4开始,有两个委托类:QItemDelegate和QStyledItemDelegate。但是,默认的委托是QStyledItemDelegate。这两个类是绘制和为视图中的项目提供编辑器的独立替代。它们之间的区别在于,QStyledItemDelegate使用当前样式来绘制其项目。因此,我们建议在实现自定义委托或使用Qt样式表时使用QStyledItemDelegate作为基类。这两个类所需的代码应该是相等的,除非自定义委托需要使用绘图的样式。如果您希望定制项目视图的绘画,您应该实现自定义样式。即QStyle类。

下面就通常需要覆写的方法进行说明

void QStyledItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;

重新实现从QAbstractItemDelegate:paint()。使用给定的painter和style选项为索引指定的项呈现委托。这个函数使用视图的QStyle绘制项。在子类中重新实现绘制时。使用initStyleOption()以与QStyledItemDelegate相同的方式设置该选项。只要有可能,在绘画的时候使用这个选项。特别是它的rect变量决定在何处绘制和它的状态,以确定是否启用或选择了它。paint绘画完成后,你应该确保paint回到使用前的状态。例如,在绘制之前调用QPainter::save(),然后调用QPainter: restore()。

注意:

1.QPainter类:QPainter提供了高度优化的函数来完成大多数GUI绘图程序所需的工作。它可以画出从简单的线条到复杂的形状,比如派和和弦。它还可以绘制对齐的文本和像素地图。通常,它画一个“自然”的坐标系统,但它也可以做视图和世界变换。QPainter可以对任何继承QPaintDevice类的对象进行操作。QPainter的常见用法是在小部件的绘图事件中:构造和定制(例如,设置钢笔或画笔)。然后画。记住在画完后要毁掉QPainter对象。

2.QStyleOptionViewItem类:QStyleOptionViewItem类用于描述用于在视图小部件中绘制项的参数。 QStyleOptionViewItem包含QStyle函数绘制Qt模型/视图类项所需的所有信息。由于性能原因,对成员变量的访问是直接的(即。,使用。或- >操作符,都定义为public公有类型)。这种低级的感觉使结构易于使用,并强调这些只是样式函数使用的参数。

3.QModelIndex类:QModelIndex类用于定位数据模型中的数据。这个类被用作从QAbstractItemModel派生的项目模型的索引。项视图、委托和选择模型使用索引来定位模型中的项。

QStyleOptionViewItem类公有区域属性的说明

QModelIndex类的说明

QModelIndex类用于定位数据模型中的数据。这个类被用作从QAbstractItemModel派生的项目模型的索引。项视图、委托和选择模型使用索引来定位模型中的项。新的QModelIndex对象由模型使用QAbstractItemModel::createIndex()函数创建。可以使用QModelIndex构造函数构造无效的模型索引。当引用模型中的顶级项时,无效索引通常用作父索引。

模型索引引用模型中的项目,并包含在这些模型中指定它们的位置所需的所有信息。每个索引位于给定的行和列中,并且可能具有父索引;使用row()、列()和父()来获取这些信息。模型中的每个顶级项都由没有父索引的模型索引表示——在本情况下:parent()将返回一个无效的模型索引,相当于使用QModelIndex()构造函数的零参数形式构造的索引。

为了获得一个模型索引,它引用模型中的现有项目,调用QAbstractItemModel::索引(),其中包含所需的行和列值,以及父类的模型索引。当在模型中引用顶级项时,供应QModelIndex()作为父索引。

注意:应该立即使用模型索引,然后丢弃。在调用修改模型结构的模型函数或删除项之后,不应该依赖索引来保持有效。如果需要长期保持模型索引,请使用QPersistentModelIndex。

QT界面 使用QStyledItemDelegate QPainter QStyleOptionViewItem QModelIndex组合实现项的绘制的更多相关文章

  1. QT界面 理解QStyle和QStyleOption以及QStyleFactory

    QStyleOption类和QStyle类简介 QStyleOption类存储QStyle函数使用的参数.QStyleOption及其子类包含了QStyle函数绘制图形元素所需的所有信息. 由于性能原 ...

  2. Qt界面设计1

    最近刚接触Qt 对于QML做界面感觉已经很轻松了,但是想尝试一下GUI..准备做一个理财的小软件 ....慢慢记录我的一点一滴的学习经历. 自己封装界面UI 遇到了好多新手级别的问题=_=!!! 1. ...

  3. Qt 界面使用自己定义控件 "提升为"

    1.效果图 我做了一个很easy的样例,一个能够显示颜色的QLabel,边上有个button,点击,跳出颜色选取的Dialog,然后选择一个颜色.这个QLabel会变成什么颜色. 2.ColorLab ...

  4. Qt之图形(QPainter的基本绘图)

    简述 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类. QPainter用来执行 ...

  5. OSG嵌入QT(QT界面使用Qt Designer编辑)

    本文主要内容:使用Qt Designer编辑好QT界面后,将OSG中的ViewerWidget嵌入到QT的Widget中. 在VS中嵌入QT工具,建立QT GUIApplication后,打开自动生成 ...

  6. 在ROS中使用QT界面

    在终端可以直接用catkin_create_qt_pkg命令创建带Qt界面的ROS package,再按照前面说的方法导入到Qt即可 这里参考的是qt_createTutorialsQt App Te ...

  7. Qt界面编程基本操作

    Qt界面编程基本操作 了解基本代码构成 类widget的头文件widget.h如下: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> ...

  8. QT界面绘制学习记录

    1. MVC结构中,model必须作为类的成员变量存在,不可再函数内部申明.否则,会出现函数调用结束,model找不到的错误. 2.QcomboBox可设置为左边空白,右侧一小箭头的形式.代码:com ...

  9. 嵌入式Linux学习笔记(六) 上位机QT界面实现和串口通讯实现

    目录 (1).参考资料 (2).QT界面布局实现 (3).数据和操作逻辑 在上一章我们实现了下位机的协议制定,并通过串口通讯工具完成了对设备内外设(LED)的状态修改,下面就要进行上位机软件的实现了( ...

随机推荐

  1. nginx配置rewrite总结

    1.rewrite regex replacement [flag] 2.flag为break时,url重写后,直接使用当前资源,不在执行location里其他语句,完成本次请求,地址栏url不变. ...

  2. OpenCV平面物体检测

    平面物体检测 这个教程的目标是学习如何使用 features2d 和 calib3d 模块来检测场景中的已知平面物体. 测试数据: 数据图像文件,比如 “box.png”或者“box_in_scene ...

  3. C/C++中的格式化字符

    格式化输出函数包括printf, fprintf, sprintf等等. 格式化输入函数包括scanf, fscanf, sscanf等等. 这类函数在输入输出的时候都有一个参数为格式化字符串(for ...

  4. Delphi 对象模型学习笔记(转)

    摘要     Borland Object Pascal 对象模型(现在已经正是命名为 Delphi 语言)与其他 OOP 语言一样,都提供了一些基础服务: 如对象创建服务.对象释放服务.对象识别服务 ...

  5. SEO之巴莱多定律

    SEO这个词在2007.2008年好像特别的火,尤其在2007年下半年至今,众多SEO爱好者发起了最大的一轮搜索引擎优化研究风暴,甚至最终逼迫百度等大型搜索引擎公司改变算法. SEO,确实能带来一些经 ...

  6. gdc skin

    https://www.gdcvault.com/play/1024410/Achieving-High-Quality-Low-Cost 这篇是教美术怎么用做地形那种方法 复用贴图 做skin的 做 ...

  7. PLSQL Developer连接远程Oracle方法(非安装client)

    远程连接Oracle比較麻烦,通常须要安装oracle的客户端才干实现. 通过instantclient能够比較简单的连接远程的Oracle. 1.新建文件夹D:\Oracle_Cleint用于存放相 ...

  8. Java笔记17:导出可执行jar包

    这里介绍Java程序的两种导出可执行jar包的方式,一种是图形界面打包,另一种是命令行打包. 一.图形界面打包 1 建立名为JarDemo的JavaProject,在src目录下建立com.abc的P ...

  9. Linux 倒引号、单引号、双引号

    1.倒引号表示命令,用于命令替换,获取命令的返回结果. echo now is `date` 或者 echo now is $(date) 2.单引号 name=Andy  没有问题, 如果想 nam ...

  10. 【转】C语言中不同的结构体类型的指针间的强制转换详解

    C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...