Qt示例 | 模拟时钟示例 Analog Clock Example

376 阅读2分钟

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

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

示例运行效果:

image.png

该示例实现了一个只有时针和分针组成的展示当前时间的时钟。随着系统时间的改变,时钟会每隔几秒更新一次。
这个例子演示了如何使用QPainter的转换和缩放功让行绘制操作变得更容易。
这个示例在对我们入门学习使用QPainter进行绘制非常有帮助。

文件目录:

image.png

这个示例只有一个main文件和一个实现时钟的AnalogClock类的.cpp和.h文件。

具体实现:

main函数:

image.png

直接创建时钟窗口并显示出来。

AnalogClock类:

image.png

AnalogClock类中只包含了一个构造函数和一个painEvent事件的响应函数。所有绘制工作都在painEvent()函数中完成。

构造函数:

image.png

构造函数中创建了一个定时器,定时器的间隔是1s钟,每隔一秒调一下update()函数刷新页面。
构造函数中还设置了窗体的标题和大小。

paintEvent函数:

image.png

  • 在设置QPainter并绘制时钟之前,首先定义了两个QPoints数组和两个QColor,它们将用于时针和分针的绘制。分针的颜色是带有透明度的。
  • 获取窗体小部件最短边的长度,可以使在绘制时钟面板时可以全部显示出来。
  • 获取当前时间。
  • 调用QPainter::setRenderHint()与QPainter::Antialiasing打开抗锯齿。这样斜线的绘制会更加流畅。
  • 调用translate函数将原点移动到窗体的中心。
  • 调用scale函数缩放坐标系,以确保将绘图操作缩放到适合大小,并且在缩放窗体时,时钟可以随着窗体大小的变化而变化。
  • QPainter负责在绘制事件期间进行的所有转换,并确保一切都被正确绘制。让QPainter处理转换通常比仅仅绘制自定义小部件的内容而执行手动计算更方便。
  • 先画时针,使用一个公式,该公式将坐标系统逆时针旋转若干度,旋转度由当前的小时和分钟决定。
  • save和restore可以保证在绘制其他单元时,不受之前的影响。
  • 绘制小时的刻度,一共12个。
  • 绘制分针,同样使用公式计算出旋转的角度。
  • 最后绘制分针的刻度。

drawConvexPolygon: 通过给定点数绘制多边形。