持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
注:示例为Qt 5.1.1中的示例。
本文旨在剖析Qt示例的源码,总结函数使用方法以及编程思想,提高自己的编程能力。
示例运行效果:
文件目录:
具体实现:
ArthurStyle类:
drawPrimitive函数:
- 当元素"PE_FrameFocusRect"不做处理。
- 当元素是"PE_IndicatorRadioButton"时,如果是enable并且hover状态,则调用drawHoverRect()函数绘制出绿色的椭圆矩形背景。如果是按下或者已选择状态时,显示radiobutton-on.png效果图,其他情况显示radiobutton_off.png效果图。
qstyleoption_cast: StyleOption类型的强制类型转换,返回指定类型或0。
State_Sunken: 表示部件是凹陷的或是按下的。
State_On: 表示部件是被选中的(checked)。
- 当元素是"PE_PanelButtonCommand"时,首先获取按钮父部件GropBox,为GroupBox填充一个由灰到白的渐变色。
- 接下来绘制按钮,如果是down状态,绘制按钮指定的按下图片样式,否则是普通图片样式(资源见下图)。如果是hover状态,在此基础上再绘制一个透明度为63,颜色为绿色的新矩形。
Q_ASSERT: 断言,是一个宏定义,接受一个布尔值,当判断的语句为真时,不做任何操作,如果判断的语句为假,那么在 debug 模式下程序运行到该地方会自动断下,并弹出一个系统消息框,并且在程序输出栏会打印出断言的位置,可以快捷的进入到该位置,便于进行修改。
adjust: 返回一个新矩形,dx1、dy1、dx2和dy2分别加到该矩形的现有坐标中。
- 当元素是"PE_FrameGroupBox"时,处理groupBox部件的样式。现画出它的渐变底色,再画出一个标题栏,然后绘制它的四个角的角图片,最后画出上下左右四个边的边图片。这就完成了一个定制的GroupBox的样式。
QPainterPath: 表示绘图路径,它提供了绘图操作的容器,可以使图形能够复用。绘图路径可以进行填充,显示轮廓和裁减。创建QPainterPath对象后,可以使用lineTo(),cubicTo(),quadTo()函数将直线和曲线添加到路径中来,直线和曲线从currentPosition()开始绘制。
这里的QPainterPath剪裁出了GroupBox的形状,是一个有四个圆角的矩形。
setClipPath()方法会自动设置setClipping()为true。需要在裁剪绘画结束后调用setClipping()传入false,使裁剪失效。
moveTo: 可以在不增加路径的情况下移动currentPosition(),它关闭一个子路径,开始一个新的子路径。currentPositino总是返回最后的子路径绘制的起点。
arcTo: 创建一个圆弧。它在给定的矩形中,从指定的起始角开始,逆时针方向扩展sweepength度。角度用度数表示。顺时针弧用负角来指定。
- 其他元素都不做处理。
未完待续...