Qt示例 | 仿射变换示例 Affine Transformations(四)

213 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

注:示例为Qt 5.1.1中的示例。
本文旨在剖析Qt示例的源码,总结函数使用方法以及编程思想,提高自己的编程能力。

示例运行效果:

1.gif

文件目录:

image.png image.png

具体实现:

ArthurStyle类:

image.png

构造函数:

image.png

构造函数中只初始化了资源。

drawHoverRect函数: image.png

这个函数用来绘制radiobutton和slider鼠标hover时的绿色椭圆矩形框。

QPainterPath: QPainterPath可以是由许多图形块组成的对象,如矩形、椭圆、直线和曲线。构建块可以是封闭的,比如椭圆。闭合路径的起点和终点重合。也可以独立存在为不封闭的子路径,比如直线和曲线。

addRect: 将给定的矩形作为封闭子路径添加到此路径。矩形是作为顺时针的线条集合添加的。添加矩形后,绘制器路径的当前位置在矩形的左上角。

addEllipse: 在指定的boundingRectangle(由参数确定的矩形)中创建一个椭圆,并将其添加到painterPath中作为一个封闭的子路径。椭圆由顺时针曲线组成,开始和结束在0度(3点钟的位置)。

setFillRule: 设置painterPath的填充规则为给定的填充规则。Qt提供了两种填充路径的方法:Qt::OddEvenFill(奇偶填补,默认)、Qt::WindingFill(绕组填补)。

  • Qt::OddEvenFill: 指定使用奇偶填充规则填充区域。从点到形状外的位置画一条水平线,计算交点的数量。如果交点数为奇数,则该点位于形状内部。可以理解为去除重复填充。
  • Qt::WindingFill: 指定使用非零绕组规则填充区域。从点到形状外的位置画一条水平线。确定线在每个交点的方向是向上还是向下。圈数由每个交点方向的总和决定。如果数值非零,则该点位于形状内部。这种填充模式在大多数情况下也可以被认为是闭合形状的交集。可以理解为全填充。

drawPrimitive函数:

image.png

该函数是重新实现了QStyle类的drawPrimitive()函数(原因之前文章有讲)。这个函数的主要功能是使用option指定的样式选项,用提供的painter绘制给定的element。
widget参数是可选的,可以包含一个小部件(widget),帮助绘制原始元素(element)。
基本元素(element)有很多,这里用到的有:

  • PE_FrameFocusRect: 焦点是在边界还是在小部件内部。
  • PE_IndicatorRadioButton: 专用的开/关指示灯,例如QRadioButton。
  • PE_PanelButtonCommand: 用于启动操作的按钮,例如QPushButton。
  • PE_FrameGroupBox: groupbox的frame。

未完待续...