分类: LINUX
2013-02-28 14:01:37
源文件:(clock.cpp)
1. #include
2. #include
3. #include
4. #include "clock.h"
5. Clock::Clock(QWidget *parent): QWidget(parent)
6. {
7. QTimer *timer = new QTimer(this);//声明一个定时器
8. connect(timer, SIGNAL(timeout()), this, SLOT(update()));//连接信号槽,定时器超时触发窗体更新
9. timer->start(1000);//启动定时器
10. setWindowTitle(tr("Clock"));//设置窗体名称
11. resize(200, 200);//设置窗体大小
12.}
13.void Clock::paintEvent(QPaintEvent *)
14.{
15. //下面三个数组用来定义表针的三个顶点,以便后面的填充
16. static const QPoint hourHand[3] = {
17. QPoint(3, 8),
18. QPoint(-3, 8),
19. QPoint(0, -40)
20. };//时针//时针绘制的情况,在QT的坐标中原点是在左上角,向下是y轴的正半轴,向右是x轴的正半轴
21. static const QPoint minuteHand[3] = {
22. QPoint(3, 8),
23. QPoint(-3, 8),
24. QPoint(0, -70)
25. };//分针
26. static const QPoint secondHand[3] = {
27. QPoint(3, 8),
28. QPoint(-3, 8),
29. QPoint(0, -90)
30. };//秒针
31. //填充表针的颜色
32. QColor hourColor(127, 0, 127);//时针颜色
33. QColor minuteColor(0, 127, 127, 191);//分针颜色(第四个表示不透明度)
34. QColor secondColor(127, 127, 0, 127);//秒针颜色(第四个表示不透明度)
35. int side = qMin(width(), height());//绘制的范围(宽、高中最小值)
36. QTime time = QTime::currentTime();//获取当前的时间
37. QPainter painter(this);//声明用来绘图用的painter
38. painter.setRenderHint(QPainter::Antialiasing);//绘制的图像反锯齿
39. painter.translate(width() / 2, height() / 2);//重新定位坐标起始点,把坐标原点放到窗体的中央
40. painter.scale(side / 200.0, side / 200.0);//设定画布的边界,用窗体宽高的最小值来计算时钟的大小,防止窗体拉伸导致的时钟变形以及显示不全
41. painter.setPen(Qt::NoPen);//填充时针,不需要边线所以NoPen
42. painter.setBrush(hourColor);//画刷颜色设定
43. painter.save();//保存painter的状态,保存的是当前的坐标状态,如果不保存,画完之后坐标以改变不方便画下一个
44. painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));//将painter(的”视角“)根据时间参数转移(30° * (小时 + 分钟 / 60))
45. painter.drawConvexPolygon(hourHand, 3);//填充时针的区域
46. painter.restore();//恢复填充前“画家”的状态,恢复保存前的坐标状态,方便下一个图形的绘制
47. painter.setPen(hourColor);//下面画表示小时的刻度,此时要用到画笔(因为要划线)
48. for (int i = 0; i < 12; ++i) //十二个刻度,循环下就好了
49. {
50. painter.drawLine(88, 0, 96, 0);//没次都是这样,先画跳线,再转个角
51. painter.rotate(30.0);//旋转30度继续画
52. }
53. //后面的跟前面的类似,分别绘制了分针和秒针,及相应的刻度
54. painter.setPen(Qt::NoPen);//填充分针,不需要边线所以NoPen
55. painter.setBrush(minuteColor);//设置画刷颜色
56. painter.save();//保存当前状态
57. painter.rotate(6.0 * (time.minute() + time.second() / 60.0));//设旋转(角度 = 6° * (分钟 + 秒 / 60))
58. painter.drawConvexPolygon(minuteHand, 3);//填充分针部分
59. painter.restore();//恢复保存前状态
60. painter.setPen(minuteColor);//设置画刷颜色
61. for (int j = 0; j < 60; ++j) //循环60次,绘制表盘(其实可以从1开始,到59,提高一点效率)
62. {
63. if ((j % 5) != 0)//判断是否能被5整除(能被5整除表示是正点刻度,暂不绘制)
64. {
65. painter.drawLine(92, 0, 96, 0);//不是正点刻度,绘制长4个像素的直线
66. }
67. painter.rotate(6.0);//旋转六度
68. }//循环60次,每次旋转6度,所以不用save和restore
69. painter.setPen(Qt::NoPen);//填充分针,不需要边线所以NoPen
70. painter.setBrush(secondColor);//设置画刷颜色
71. painter.save();//保存当前状态
72. painter.rotate(6.0 * time.second());//设置旋转(6° * 秒)
73. painter.drawConvexPolygon(secondHand, 3);//设置填充
74. painter.restore();//恢复保存前状态
75. //painter.end();//释放掉图形所占存储空间,因为我们要不停的绘制,所以不释放掉空间,否则每次都申请空间很耗资源
76.}