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

295 阅读3分钟

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

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

示例运行效果:

1.gif

文件目录:

image.png image.png

具体实现:

ArthurStyle类:

image.png

drawComplexControl函数:

这个函数是用来实现复杂控件的绘制的,我们这里主要用来绘制两个小部件,一个是滚动条,一个是Combox。复杂控件是指它上面会包含很多行为,如确定点击位置和按下的按键等。

image.png

  • 滚动条部件: 首先获取滑块和滑块可以滑动的凹槽(groove)的区域。判断hover状态,如果是hover状态,绘制它的hover的效果(绿色底色,范围是本身的大小上下各缩小4个像素)。然后分别绘制了滑块和凹槽的样式。

image.png

  • GroupBox部件: 首先获取到GroupBox的标题框,绘制标题框的背景,然后绘制标题框中的文字。

QStyleOptionGroupBox: 类用来表示GroupBox的参数。
translated: 返回一个矩形的副本,该矩形相对于当前位置在x轴上平移dx,在y轴上平移dy。正值代表将矩形向右和向下移动。

drawControl函数:

image.png

这个函数用来绘制一些控制类部件,控件类部件是执行某些操作或向用户显示信息的小部件的一部分。这里主要实现了对RadioButton和PushButton的自定义绘制。

  • RadioButton: 这里主要实现对RadioButton中文字的绘制。设置了文字颜色、对齐方式、显示区域等。\
  • PushButton: 这里主要也是对PushButton中的文字进行了特殊绘制。文字颜色为黑色,水平垂直居中。

subControlRect函数:

image.png

这个函数主要用来实现对子控件的绘制,子控件属于复杂控件的一部分。这里主要实现了对GroupBox的绘制。包括对GroupBox的内容、边框和标题栏的绘制。还有对滚动条的绘制。设置了滚动条中滑块的宽高和凹槽的高度跟位置。

sizeFromContents函数:

image.png

这个函数主要实现根据元素的类型和选项以及指定的大小,返回一个新的大小(根据小部件本身的大小为小部件设置一个新的大小)。这里返回了RadioButton、PushButton、Slider的大小。

QCommonStyle::sizeFromContents: 根据提供的第三个参数(contentsSize)返回指定选项(option)和类型(type)所描述的元素(element)的大小。

pixelMetric函数:

image.png

这里是用来获取指定小部件的像素值的,这里获取了Slidr的高度值。

pixelMetric: 此描述各种可用的像素度量。像素度量是由单个像素值表示的与样式相关的大小。

polish函数:

image.png

这个函数用来初始化给定小部件的外观。在每个小部件完全创建之后的某个时刻,在它第一次显示之前,都会调用这个函数。

unpolish函数:

image.png

这个函数是用来取消初始化给定小部件的外观的。这个函数是polish()的对应函数。每当样式被动态更改时,它会为每个抛光小部件调用;前一种样式必须在新样式可以再次润色它们之前对其设置进行润色。

polish函数:

image.png

这个函数是根据调色板的特定样式要求(如果有的话)更改调色板。和上面的polish函数类似,只不过参数不同,操作的对象不同。

subElementRect函数:

image.png

这个函数返回给定元素的子区域,如所提供的样式选项所述。返回的矩形在屏幕坐标中的位置。可以在函数中对原始区域更改并返回新的区域。

未完待续...