• Qt开源 自绘时钟


    1. #ifndef CLOCK1_H
    2. #define CLOCK1_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    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
    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. }

  • 相关阅读:
    学习UI第一天
    C++PrimerPlus(第6版)中文版:Chapter13.3多态公有继承例子:usebrass1.cpp
    <数据集>Udacity交通目标识别数据集<目标检测>
    如何使用ZIP方式安装MySQL:简单、快速、高效的安装方法
    VPN相关概念:VPN和VPS、SSR、加速器有什么区别?
    PY32F002B从压缩包到实现串口printf输出
    CYarp:力压frp的C#高性能http内网反代中间件
    防火墙的策略路由PBR
    postgresql数据库docker
    【Fusion360】常用快捷键和技巧
  • 原文地址:https://blog.csdn.net/qq_31565379/article/details/139449596