当前位置:   article > 正文

Qt开源 自绘时钟

Qt开源 自绘时钟

  1. #ifndef CLOCK1_H
  2. #define CLOCK1_H
  3. #include <QTime>
  4. #include <QtMath>
  5. #include <QDialog>
  6. #include <QPainter>
  7. #include <QPaintEvent>
  8. #include <QPainterPath>
  9. class Clock1 : public QDialog
  10. {
  11. Q_OBJECT
  12. private:
  13. double hour;
  14. double minute;
  15. double second;
  16. public:
  17. Clock1(QWidget *parent = nullptr);
  18. ~Clock1();
  19. protected:
  20. virtual void timerEvent(QTimerEvent*);
  21. virtual void paintEvent(QPaintEvent*);
  22. public:
  23. void DrawScaleLine(QPainter&,int);
  24. void DrawDialNumber(QPainter&,int);
  25. void DrawHourPointer(QPainter&,int);
  26. void DrawSecondPointer(QPainter&,int);
  27. void DrawMinutePointer(QPainter&,int);
  28. void DrawCircularRing1(QPainter&,int,int);
  29. void DrawCircularRing2(QPainter&,int,int);
  30. void DrawCircularRing3(QPainter&,int,int);
  31. };
  32. #endif

  1. #include "Clock1.h"
  2. Clock1::Clock1(QWidget *parent)
  3. : QDialog(parent)
  4. {
  5. //初始化变量
  6. hour=0;
  7. minute=0;
  8. second=0;
  9. //设置窗口大小
  10. setFixedSize(600,600);
  11. //去掉问号
  12. Qt::WindowFlags flags= this->windowFlags();
  13. setWindowFlags(flags&~Qt::WindowContextHelpButtonHint);
  14. //背景设置成白色
  15. QPalette bgpal=palette();
  16. bgpal.setColor(QPalette::Background,QColor(255,255,255));
  17. setPalette(bgpal);
  18. //设置定时器
  19. startTimer(1000);
  20. //执行一次绘图
  21. QTime curr_time =QTime::currentTime();
  22. second=curr_time.second();
  23. minute=curr_time.minute()+second/60;
  24. hour=curr_time.hour()+minute/60;
  25. }
  26. Clock1::~Clock1(){}
  27. #include <QDebug>
  28. void Clock1::timerEvent(QTimerEvent*)
  29. {
  30. QTime curr_time=QTime::currentTime();
  31. second=curr_time.second();
  32. minute=curr_time.minute()+second/60;
  33. hour=curr_time.hour()+minute/60;
  34. update();
  35. }
  36. void Clock1::paintEvent(QPaintEvent*)
  37. {
  38. //初始化画图对象
  39. QPainter painter(this);
  40. //绘图坐标移动到中心
  41. int width=this->width();
  42. int height=this->height();
  43. painter.translate(width>>1,height>>1);
  44. int radius=((width>height)?height:width)/2-30;
  45. //启用反锯齿
  46. painter.setRenderHint(QPainter::Antialiasing, true);
  47. //取消画笔
  48. painter.setPen(Qt::NoPen);
  49. //绘制第一层圆环
  50. DrawCircularRing1(painter,radius,radius-4);
  51. //绘制第二层圆环
  52. DrawCircularRing2(painter,radius-4,radius-20);
  53. //绘制第三层圆环
  54. DrawCircularRing3(painter,radius-20,radius-25);
  55. //绘制表盘刻度线
  56. DrawScaleLine(painter,radius-35);
  57. //绘制表盘上数字
  58. DrawDialNumber(painter,radius-70);
  59. //绘制时针
  60. DrawHourPointer(painter,radius-150);
  61. //绘制分针
  62. DrawMinutePointer(painter,radius-120);
  63. //绘制秒针
  64. DrawSecondPointer(painter,radius-100);
  65. }
  66. void Clock1::DrawCircularRing1(QPainter& painter,int radius1,int radius2)
  67. {
  68. //保存绘图对象
  69. painter.save();
  70. //计算大小圆路径
  71. QPainterPath outRing;
  72. QPainterPath inRing;
  73. outRing.moveTo(0,0);
  74. inRing.moveTo(0,0);
  75. outRing.addEllipse(-radius1,-radius1, 2*radius1,2*radius1);
  76. inRing.addEllipse(-radius2,-radius2,2*radius2,2*radius2);
  77. outRing.closeSubpath();
  78. //设置画刷
  79. painter.setBrush(QColor(200,200,200));
  80. //大圆减去小圆得到圆环
  81. painter.drawPath(outRing.subtracted(inRing));
  82. //恢复绘图对象
  83. painter.restore();
  84. }
  85. void Clock1::DrawCircularRing2(QPainter& painter,int radius1,int radius2)
  86. {
  87. //保存绘图对象
  88. painter.save();
  89. //计算大小圆路径
  90. QPainterPath outRing;
  91. QPainterPath inRing;
  92. outRing.moveTo(0,0);
  93. inRing.moveTo(0,0);
  94. outRing.addEllipse(-radius1,-radius1, 2*radius1,2*radius1);
  95. inRing.addEllipse(-radius2,-radius2,2*radius2,2*radius2);
  96. outRing.closeSubpath();
  97. //设置画刷
  98. painter.setBrush(QColor(235,235,235));
  99. //大圆减去小圆得到圆环
  100. painter.drawPath(outRing.subtracted(inRing));
  101. //恢复绘图对象
  102. painter.restore();
  103. }
  104. void Clock1::DrawCircularRing3(QPainter& painter,int radius1,int radius2)
  105. {
  106. //保存绘图对象
  107. painter.save();
  108. //计算大小圆路径
  109. QPainterPath outRing;
  110. QPainterPath inRing;
  111. outRing.moveTo(0,0);
  112. inRing.moveTo(0,0);
  113. outRing.addEllipse(-radius1,-radius1, 2*radius1,2*radius1);
  114. inRing.addEllipse(-radius2,-radius2,2*radius2,2*radius2);
  115. outRing.closeSubpath();
  116. //设置画刷
  117. painter.setBrush(QColor(180,180,180));
  118. //大圆减去小圆得到圆环
  119. painter.drawPath(outRing.subtracted(inRing));
  120. //恢复绘图对象
  121. painter.restore();
  122. }
  123. void Clock1::DrawScaleLine(QPainter& painter,int radius)
  124. {
  125. //设置画刷
  126. painter.setBrush(QColor(100,100,100));
  127. //组装点的路径图
  128. QPainterPath pointPath1;
  129. pointPath1.moveTo(-2,-2);
  130. pointPath1.lineTo(-1,-4);
  131. pointPath1.lineTo(1,-4);
  132. pointPath1.lineTo(2,-2);
  133. pointPath1.lineTo(1,8);
  134. pointPath1.lineTo(-1,8);
  135. QPainterPath pointPath2;
  136. pointPath2.moveTo(-2,-2);
  137. pointPath2.lineTo(-1,-4);
  138. pointPath2.lineTo(1,-4);
  139. pointPath2.lineTo(2,-2);
  140. pointPath2.lineTo(1,20);
  141. pointPath2.lineTo(-1,20);
  142. //绘制25个刻度
  143. for(int i=0;i<60;++i){
  144. QPointF point(0,0);
  145. painter.save();
  146. //计算并移动绘图对象中心点
  147. point.setX(radius*qCos(((90-i*6)*M_PI)/180));
  148. point.setY(radius*qSin(((90-i*6)*M_PI)/180));
  149. //计算并移动绘图对象的中心点
  150. painter.translate(point.x(),-point.y());
  151. //计算并选择绘图对象坐标
  152. painter.rotate(i*6);
  153. //绘制路径
  154. if(i%5){
  155. painter.drawPath(pointPath1);
  156. }
  157. else{
  158. painter.drawPath(pointPath2);
  159. }
  160. painter.restore();
  161. }
  162. }
  163. void Clock1::DrawDialNumber(QPainter& painter,int radius)
  164. {
  165. painter.setPen(QColor(100,100,100));
  166. QFont font;
  167. font.setFamily("SimHei");
  168. font.setPointSize(16);
  169. painter.setFont(font);
  170. //绘制13个小点
  171. for(int i=0;i<12;++i){
  172. QPointF point(0,0);
  173. painter.save();
  174. //计算并移动绘图对象中心点
  175. point.setX(radius*qCos(((60-i*30)*M_PI)/180));
  176. point.setY(radius*qSin(((60-i*30)*M_PI)/180));
  177. //计算并移动绘图对象的中心点
  178. painter.translate(point.x(),-point.y());
  179. //绘制路径
  180. painter.drawText(-15, -15, 30, 30,Qt::AlignCenter,QString::number(i+1));
  181. painter.restore();
  182. }
  183. }
  184. void Clock1::DrawHourPointer(QPainter& painter,int radius)
  185. {
  186. painter.setPen(Qt::NoPen);
  187. //组装点的路径图
  188. QPainterPath pointPath;
  189. pointPath.moveTo(10,0);
  190. pointPath.lineTo(1,-radius);
  191. pointPath.lineTo(-1,-radius);
  192. pointPath.lineTo(-10,0);
  193. pointPath.arcTo(-10,0,20,20,180,180);
  194. painter.save();
  195. //计算并选择绘图对象坐标
  196. painter.rotate(hour*30);
  197. //设置画刷
  198. painter.setBrush(QColor(0,0,0,200));
  199. //绘制路径
  200. painter.drawPath(pointPath);
  201. painter.restore();
  202. }
  203. void Clock1::DrawMinutePointer(QPainter& painter,int radius)
  204. {
  205. //组装点的路径图
  206. QPainterPath pointPath;
  207. pointPath.moveTo(10,0);
  208. pointPath.lineTo(1,-radius);
  209. pointPath.lineTo(-1,-radius);
  210. pointPath.lineTo(-10,0);
  211. pointPath.arcTo(-10,0,20,20,180,180);
  212. painter.save();
  213. //计算并选择绘图对象坐标
  214. painter.rotate(minute*6);
  215. //设置画刷
  216. painter.setBrush(QColor(0,0,0,200));
  217. //绘制路径
  218. painter.drawPath(pointPath);
  219. painter.restore();
  220. }
  221. void Clock1::DrawSecondPointer(QPainter& painter,int radius)
  222. {
  223. //组装点的路径图
  224. QPainterPath pointPath;
  225. pointPath.moveTo(10,0);
  226. pointPath.lineTo(1,-radius);
  227. pointPath.lineTo(-1,-radius);
  228. pointPath.lineTo(-10,0);
  229. pointPath.arcTo(-10,0,20,20,180,180);
  230. QPainterPath inRing;
  231. inRing.addEllipse(-5,-5,10,10);
  232. painter.save();
  233. //计算并选择绘图对象坐标
  234. painter.rotate(second*6);
  235. //设置画刷
  236. painter.setBrush(QColor(255,0,0,200));
  237. //绘制路径
  238. painter.drawPath(pointPath.subtracted(inRing));
  239. painter.restore();
  240. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/680774
推荐阅读
相关标签
  

闽ICP备14008679号