• QT : 完成绘制时钟


    1.头文件

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. QT_BEGIN_NAMESPACE
    11. namespace Ui { class Widget; }
    12. QT_END_NAMESPACE
    13. class Widget : public QWidget
    14. {
    15. Q_OBJECT
    16. public:
    17. Widget(QWidget *parent = nullptr);
    18. ~Widget();
    19. //重写绘制事件事件处理函数
    20. void paintEvent(QPaintEvent *event) override;
    21. private slots:
    22. void updateTime();
    23. private:
    24. Ui::Widget *ui;
    25. QTimer *timer;
    26. QPixmap dial;
    27. };
    28. #endif // WIDGET_H

    2.源文件

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. Widget::Widget(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::Widget)
    6. {
    7. ui->setupUi(this);
    8. this->setFixedSize(600,600);
    9. QTimer *timer = new QTimer(this);
    10. connect(timer,&QTimer::timeout,this,&Widget::updateTime);
    11. timer->start(1000);
    12. this->setStyleSheet("background-color:white;");
    13. }
    14. Widget::~Widget()
    15. {
    16. delete ui;
    17. }
    18. void Widget::paintEvent(QPaintEvent *event)
    19. {
    20. Q_UNUSED(event);
    21. //实例化一个画家
    22. QPainter painter(this);
    23. //设置绘图器(QPainter)的渲染提示,开启抗锯齿效果
    24. painter.setRenderHint(QPainter::Antialiasing);
    25. //获取当前时间
    26. QTime currentTime = QTime::currentTime();
    27. int X=this->width()/2;
    28. int Y=this->height()/2;
    29. int radius=200;
    30. //绘制表盘
    31. painter.setPen(QPen(Qt::black,7)); //设置笔
    32. if(dial.isNull())
    33. {
    34. dial.load("E:\\clock.png");
    35. }
    36. if(!dial.isNull())
    37. {
    38. painter.drawPixmap(X-radius,Y-radius,radius*2,radius*2,dial);
    39. }
    40. //绘制时针
    41. painter.save(); // 保存当前的绘制状态
    42. painter.translate(X,Y); // 将绘制的坐标原点移动到表盘的中心
    43. int hour = currentTime.hour(); // 获取当前的小时
    44. int minute = currentTime.minute(); // 获取当前的分钟
    45. double hourAngle = (hour%12 + minute/60.0)*30.0; // 计算时针的角度,考虑分钟对时针的影响
    46. painter.rotate(-90); // 将坐标系旋转,使12点位置对应0度
    47. painter.rotate(hourAngle); // 旋转坐标系,使时针指向正确的位置
    48. painter.setPen(QPen(Qt::black,5)); //设置笔
    49. painter.drawLine(0,0,0,-radius*0.5); // 绘制时针,起点是坐标原点 (0, 0),终点是时针的末端位置
    50. painter.restore(); // 恢复之前保存的绘制状态,以便后续绘制
    51. //绘制分针
    52. painter.save();
    53. painter.translate(X,Y);
    54. double minuteAngle = minute*6.0;
    55. painter.rotate(-90);
    56. painter.rotate(minuteAngle);
    57. painter.setPen(QPen(Qt::red,3)); //设置笔
    58. painter.drawLine(0,0,0,-radius*0.7);
    59. painter.restore();
    60. //绘制秒针
    61. painter.save();
    62. painter.translate(X,Y);
    63. int second = currentTime.second();
    64. double secondAngle = second * 6.0;
    65. painter.rotate(-90);
    66. painter.rotate(secondAngle);
    67. painter.setPen(QPen(Qt::blue,2)); //设置笔
    68. painter.drawLine(0,0,0,-radius*0.9);
    69. painter.restore();
    70. }
    71. void Widget::updateTime()
    72. {
    73. update();
    74. }

  • 相关阅读:
    docker安装RabbitMQ及安装延迟插件
    利用eNSP实现telent远程登陆
    Scala基础教程--16--泛型
    【文献研究】国际班轮航运的合作博弈:The coopetition game in international liner shipping
    第三章 链路层
    苏格拉底、柏拉图、亚里士多德,走进希腊三贤的世界
    蓝桥杯 枚举算法 (c++)
    点击化学 PEG 试剂:1802907-92-1,Mtz-PEG4-NHS,甲基四嗪-四聚乙醇-活性酯
    R语言mgcv包广义可加模型对分类曲线进行拟合
    开启金融之门,一切皆有可能——人大女王金融硕士项目助您成就辉煌
  • 原文地址:https://blog.csdn.net/2301_78047404/article/details/133122007