• 23062day4


    制作一个简易圆形时钟

    头文件:

    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. void timerEvent(QTimerEvent *e)override;
    20. void paintEvent(QPaintEvent *event) override;
    21. private:
    22. Ui::Widget *ui;
    23. int timer_id;
    24. };
    25. #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. Widget::~Widget()
    10. {
    11. delete ui;
    12. }
    13. void Widget::paintEvent(QPaintEvent *event)
    14. {
    15. QPainter painter(this);//创建一个画师对象
    16. painter.setRenderHint(QPainter::Antialiasing);
    17. // 将原点移动到窗口中心 (使画布居中)
    18. painter.translate(width() / 2, height() / 2);
    19. //放大
    20. painter.scale(2, 2);
    21. // 绘制表盘
    22. painter.setPen(Qt::black);//设置画笔为空。
    23. painter.setBrush(Qt::white);//设置画刷为白色。
    24. painter.drawEllipse(-100,-100, 200, 200);
    25. painter.drawText(-7,-78,"12");
    26. painter.drawText(78,5,"3");
    27. painter.drawText(-5,85,"6");
    28. painter.drawText(-83,5,"9");
    29. // 绘制刻度
    30. painter.setPen(Qt::black);//设置画笔为黑色。
    31. for (int i = 0; i < 12; ++i) {//循环绘制时钟刻度
    32. painter.drawLine(0, -90, 0, -100);
    33. painter.rotate(30);
    34. }
    35. for (int i = 0; i < 36; ++i) {
    36. painter.drawLine(0, -95, 0, -100);
    37. painter.rotate(10);
    38. }
    39. // 绘制时针、分针和秒针
    40. QTime time = QTime::currentTime();//获取当前时间。
    41. painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
    42. painter.setPen(Qt::NoPen);
    43. painter.setBrush(Qt::black);
    44. // 绘制时针,以多边形方式绘制,坐标点依次为(-2,5)、(2,5)、(0,-80)
    45. painter.drawPolygon(QPolygonF(QVector() << QPointF(-2, 5)
    46. << QPointF(2, 5)
    47. << QPointF(0, -50)));
    48. painter.rotate(6.0 * (time.minute() + time.second() / 60.0));//60分钟转360度,一分钟转6度
    49. painter.setBrush(Qt::blue);
    50. painter.drawPolygon(QPolygonF(QVector() << QPointF(-1, 5)
    51. << QPointF(1, 5)
    52. << QPointF(0, -75)));
    53. painter.rotate(6.0 * time.second());
    54. painter.setBrush(Qt::red);
    55. painter.drawPolygon(QPolygonF(QVector() << QPointF(-1, 5)
    56. << QPointF(1, 5)
    57. << QPointF(0, -90)));
    58. this->update();
    59. }
    60. void Widget::timerEvent(QTimerEvent *e)
    61. {
    62. timer_id=this->startTimer(1000);
    63. }

    测试文件:

    1. #include "widget.h"
    2. #include
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. Widget w;
    7. w.show();
    8. return a.exec();
    9. }

    运行结果:

    思维导图

  • 相关阅读:
    Java实现模拟键盘和鼠标操作
    (三)Redis 线程与IO模型
    JavaWeb学习路线(1)——Ajax到Axios
    为gnustep项目移植到wsl的过程
    redis基础1——发展历程+源码安装及配置+基本常识
    Python每日一练(牛客新题库)——第23天:内置函数
    浅谈ClickHouse安全性和权限管理
    【owt-server】Internal Transport 内部流传输机制文档
    iPhone14有望实现息屏显示;张朝阳回应搜狐全体员工遭遇工资补助诈骗,损失总额少于5万;GitLab 15发布|极客头条
    金山WPS:我们当年上了微软的当,现在终于扳回一局了
  • 原文地址:https://blog.csdn.net/cwj442257772/article/details/133101233