持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
注:示例为Qt 5.1.1中的示例。
本文旨在剖析Qt示例的源码,总结函数使用方法以及编程思想,提高自己的编程能力。
示例运行效果:
该示例展示了在Widget和GLWidget中同时执行相同的绘制操作表现出的效果。
GLWidget的基类是QOpenGLWidget,Widget继承自QWidget类,它们的区别在于GLWidget中的渲染质量和速度取决于系统的OpenGL驱动程序提供的多重采样和硬件加速的支持级别。如果缺少对其中任何一个的支持,驱动程序可能会依赖于软件渲染器,以质量换取速度。
显示上的区别在于,调用相同的渲染方法,当设置不同的多重采样数时,GLWidget展现的抗锯齿的效果是不一样的。
文件目录:
主窗体为window类,左边的绘图窗体为Widget类,右边的绘图窗体为GLWidget类,Helper类为绘制操作类。
具体实现:
Helper类:
在本例中,绘制操作由Helper类执行。这样做是为了实现对我们创建的Widget子类和GLWidget子类执行相同的绘制操作。Helper类是项目中最小(最底层)的一个类。
它除了构造函数,只提供了一个paint()函数,用于对小部件子类提供的绘制器进行绘制。
构造函数:
构造函数设置了在小部件上绘制内容所需的资源。包括小部件的背景颜色画刷、部件中圆形图案的画刷(这个画刷的颜色是渐变色)、部件中文字的字体、圆形图案的画笔、文字画笔。
QLinearGradient:
这里圆形图案的画刷是一个渐变色,QLinearGradient是Qt中支持的一种渐变填充方式,显示从起点到终点的直线渐变。
QLinearGradient类构造函数的第一个参数指定渐变的起点,第二个参数指定渐变的终点, 然后显示渐变。成员函数setColorAt()设置起点和终点之间要显示的颜色。
paint函数:
实际的绘制操作是在paint()函数中执行的。
参数为:一个在绘制设备上绘制的QPainter(这里绘制设备为QWidget或QGLWidget);
一个QPaintEvent,QPaintEvent提供关于将要绘制的区域的信息;
以及自上次更新绘制设备以来所经过的时间(单位:毫秒)。
这里完成了对小部件背景颜色的填充、对圆形图案的绘制以及对文字的绘制。
螺旋效果的实现是先实现静态的圆形的螺旋图案,然后开启一个定时器使用指定的运行时间使它们动起来,使它们看起来像围绕着坐标系统的原点在向外移动。
translate: 按给定的偏移量平移坐标系;坐标原点原本在部件的左上角的位置,为(0,0),调用translate(100,100)后,部件的坐标原点向右挪了100个像素,向下挪了100个像素。这时新的坐标原点在距离部件左上角(100,100)的位置,这里要注意,移动后的坐标原点的值仍为(0,0)。
save和restore: 保存和恢复QPainter的状态。在绘制复杂图形时候,我们常用这个功能,来保证图形的正确绘制,不因为多次变换QPainter属性导致绘图错误,只需要调用这一组函数,就能实现QPainter状态的存储。
rotate: 顺时针旋转坐标系。参数为角度,单位:度。
drawEllipse: 绘制由给定矩形定义的椭圆。
未完待续...