• 2023/09/20 day4 qt


    做一个动态指针钟表

    头文件

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

    源文件

    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. //给定时器指针实例化对象
    9. timer = new QTimer(this);
    10. connect(timer,&QTimer::timeout,this,&Widget::timeout_slot);
    11. }
    12. Widget::~Widget()
    13. {
    14. delete ui;
    15. }
    16. void Widget::paintEvent(QPaintEvent *event)
    17. {
    18. //定义一个画家类
    19. QPainter p1(this);
    20. //实例化一个画笔
    21. QPen pen1; //无参构造
    22. pen1.setColor(QColor("red"));
    23. pen1.setStyle(Qt::SolidLine); //设置线形,默认实线
    24. pen1.setWidth(5); //设置粗细
    25. p1.setPen(pen1);
    26. //直径
    27. int side = qMin(this->width(),this->height());
    28. //设置起始坐标
    29. p1.translate(this->width()/2,this->height()/2); //ui界面中心
    30. //画个圆圈当作表盘
    31. p1.drawEllipse(QPoint(0,0),side/2,side/2);
    32. //绘制刻度线
    33. pen1.setColor(QColor("black"));
    34. pen1.setWidth(3);
    35. p1.setPen(pen1);
    36. for(int i=0;i<12;i++)
    37. {
    38. p1.drawLine(0,-side/2+10,0,-side/2+20);
    39. p1.rotate(30);
    40. }
    41. //绘制时针、分针、秒针
    42. QTime curretTime = QTime::currentTime();
    43. //时针
    44. p1.setPen(Qt::NoPen);
    45. p1.setBrush(Qt::blue);
    46. p1.save();
    47. p1.rotate(30*(curretTime.hour()+curretTime.minute()/60));
    48. p1.drawConvexPolygon(QPolygon(QVector()<<QPoint(-2,-40)<<QPoint(2,-40)<<QPoint(4,0)<<QPoint(-4,0)));
    49. p1.restore();
    50. //分针
    51. p1.setBrush(Qt::black);
    52. p1.save();
    53. p1.rotate(6*(curretTime.minute() + curretTime.second() / 60));
    54. p1.drawConvexPolygon(QPolygon(QVector() << QPoint(-1, -50) << QPoint(1, -50) << QPoint(1, 100) << QPoint(-1, 100)));
    55. p1.restore();
    56. //秒针
    57. p1.setPen(Qt::red);
    58. p1.setBrush(Qt::red);
    59. p1.save();
    60. p1.rotate(6* curretTime.second());
    61. p1.drawConvexPolygon(QPolygon(QVector() << QPoint(-1, -70) << QPoint(1, -70) << QPoint(0, 160) << QPoint(-0, 160)));
    62. p1.restore();
    63. }
    64. //启动定时器按钮对应的槽函数
    65. void Widget::on_startbtn_clicked()
    66. {
    67. timer->start(1000);
    68. }
    69. void Widget::timeout_slot()
    70. {
    71. update();
    72. }

    效果图

  • 相关阅读:
    vue组件缓存
    侦听器&&模板引用&&组件注册&&组件之间的数据传递
    使用FastReport导出Excel文件
    python—如何提取word中指定内容
    java 实现原型模式
    AQS源码阅读与强软弱虚4种引用以及ThreadLocal原理与源码
    天宇优配|突然爆雷!大跌15%!
    低代码引擎半岁啦,来跟大家唠唠嗑...
    BAT大厂Java面试,如何抓住面试重点知识?收割大厂offer
    大语言模型(LLM)Token 概念
  • 原文地址:https://blog.csdn.net/cscssacd/article/details/133103294