当前位置: 首页 > 网络知识

Qt 项目实战:电子时钟

时间:2026-01-29 09:26:28

电子时钟
隐藏widget边框

this>setWindowFlags(Qt::FramelessWindowHint); // 隐藏边框

实时跟踪鼠标

this>setMouseTracking(true); // 实时跟踪鼠标

通过信号与槽来刷新时针分针秒针状态

connect(timer, SIGNAL(timeout()), this, SLOT(update()));

鼠标左键按下移动窗口

1 /** 2 * 鼠标当前坐标 移动窗口 3 * @brief Widget::mouseMoveEvent 4 * @param event 5 */ 6 void Widget::mouseMoveEvent(QMouseEvent *event) 7 18 }

设置移动窗口的位置

1 /** 2 * 窗口移动的位置都是相对于桌面左上角 3 * @brief Widget::mousePressEvent 4 * @param event 5 */ 6 void Widget::mousePressEvent(QMouseEvent *event) 7

绘制时钟

1 /** 2 * 绘制时钟 3 * @brief Widget::paintEvent 4 * @param event 5 */ 6 void Widget::paintEvent(QPaintEvent *event) 7 ; 14 static const QPoint minuteHand[3]=; 19 static const QPoint secondHand[3]=; 24 QTime time = QTime::currentTime(); 25 26 paint.begin(this); 27 28 paint.setRenderHint(QPainter::Antialiasing,true); 29 paint.translate(this>width()/2,this>height()/2); // 移动坐标 30 31 // 缩放 32 int side = qMin(width(),height()); // 长宽的最小值:定义一个边界 保证是圆形的 33 paint.scale(side /200.0,side/200.0); // 跟随窗口大小发生变化 34 35 // 绘制时针刻度线 36 paint.setPen(Qt::white); 37 for (int i =0; i <12; i++) 41 42 // 绘制分针刻度线 (360 / 60 = 6) 43 for(int j =0; j < 60; j++) 48 paint.rotate(6.0); 49 } 50 51 // 绘制时针 旋转角度 = 小时数 * 30° 52 paint.save(); 53 paint.setBrush(Qt::white); // 设置指针填充色 54 paint.rotate(30.0 * (time.hour() + time.minute() /60.0)); 55 paint.drawConvexPolygon(hourHand,3); 56 paint.restore(); // 还原画笔 57 58 // 绘制分针 旋转角度 = 分钟数 * 6° 59 paint.save(); 60 paint.rotate(6.0 * (time.minute() + time.second() / 60.0)); 61 paint.drawConvexPolygon(minuteHand,3); 62 paint.restore(); // 还原画笔 64 // 绘制秒针 旋转角度 = 秒数 * 6° 65 paint.save(); 66 paint.rotate(6.0 * time.second()); 67 paint.drawConvexPolygon(secondHand,3); 68 paint.restore(); // 还原画笔 69 70 paint.end(); 71 }

鼠标双击全屏显示

1 /** 2 * 鼠标双击全屏 3 * @brief Widget::mouseDoubleClickEvent 4 * @param event 5 */ 6 void Widget::mouseDoubleClickEvent(QMouseEvent *event) 7 14 else 15 19 }

lcd显示时间

1 void Widget::refreshTime() 2

完整代码

widget.h

1 #ifndef WIDGET_H 2 #define WIDGET_H 3 4 #include <QWidget> 5 #include <QTimer> 6 #include <QTime> 7 #include <QDebug> 8 #include <QMenu> 9 #include <QMouseEvent> 10 #include <QPaintEvent> 11 #include <QAction> 12 #include <QToolTip> 13 #include <QPainter> 14 15 QT_BEGIN_NAMESPACE 16 namespace Ui 17 QT_END_NAMESPACE 18 19 class Widget : public QWidget 20 ; 53 #endif // WIDGET_H

widgetpp

1 #include "widget.h" 2 #include "ui_widget.h" 3 4 Widget::Widget(QWidget *parent) 5 : QWidget(parent) 6 , ui(new Ui::Widget) 7 20 21 Widget::~Widget() 22 25 26 void Widget::refreshTime() 27 32 33 /** 34 * 右键菜单接口 35 * @brief Widget::contextMenuEvent 36 * @param event 37 */ 38 void Widget::contextMenuEvent(QContextMenuEvent *event) 39 47 48 /** 49 * 右键菜单结构 50 * @brief Widget::createActions 51 */ 52 void Widget::createActions() 53 73 74 /** 75 * 鼠标当前坐标 移动窗口 76 * @brief Widget::mouseMoveEvent 77 * @param event 78 */ 79 void Widget::mouseMoveEvent(QMouseEvent *event) 80 91 } 92 93 /** 94 * 窗口移动的位置都是相对于桌面左上角 95 * @brief Widget::mousePressEvent 96 * @param event 97 */ 98 void Widget::mousePressEvent(QMouseEvent *event) 99 103 104 /** 105 * 绘制时钟 106 * @brief Widget::paintEvent 107 * @param event 108 */ 109 void Widget::paintEvent(QPaintEvent *event) 110 ; 117 static const QPoint minuteHand[3]=; 122 static const QPoint secondHand[3]=; 127 QTime time = QTime::currentTime(); 128 129 paint.begin(this); 130 131 paint.setRenderHint(QPainter::Antialiasing,true); 132 paint.translate(this>width()/2,this>height()/2); // 移动坐标 133 134 // 缩放 135 int side = qMin(width(),height()); // 长宽的最小值:定义一个边界 保证是圆形的 136 paint.scale(side /200.0,side/200.0); // 跟随窗口大小发生变化 137 138 // 绘制时针刻度线 139 paint.setPen(Qt::white); 140 for (int i =0; i <12; i++) 144 145 // 绘制分针刻度线 (360 / 60 = 6) 146 for(int j =0; j < 60; j++) 151 paint.rotate(6.0); 152 } 153 154 // 绘制时针 旋转角度 = 小时数 * 30° 155 paint.save(); 156 paint.setBrush(Qt::white); // 设置指针填充色 157 paint.rotate(30.0 * (time.hour() + time.minute() /60.0)); 158 paint.drawConvexPolygon(hourHand,3); 159 paint.restore(); // 还原画笔 160 161 // 绘制分针 旋转角度 = 分钟数 * 6° 162 paint.save(); 1 paint.rotate(6.0 * (time.minute() + time.second() / 60.0)); 164 paint.drawConvexPolygon(minuteHand,3); 165 paint.restore(); // 还原画笔 166 167 // 绘制秒针 旋转角度 = 秒数 * 6° 168 paint.save(); 169 paint.rotate(6.0 * time.second()); 170 paint.drawConvexPolygon(secondHand,3); 171 paint.restore(); // 还原画笔 172 173 paint.end(); 174 } 175 176 /** 177 * 鼠标双击全屏 178 * @brief Widget::mouseDoubleClickEvent 179 * @param event 180 */ 181 void Widget::mouseDoubleClickEvent(QMouseEvent *event) 182 189 else 190 194 }


上一篇:Qt QPushButton 点击信号分析
下一篇:FileZilla Server 使用教程
Qt
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素