首页 > 其他分享 >Qt 项目实战:电子时钟

Qt 项目实战:电子时钟

时间:2024-02-19 13:59:36浏览次数:32  
标签:实战 Widget Qt 鼠标 void QPoint include event 时钟

电子时钟
隐藏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 {
 8     QString posStr = QString("%1,%2").arg(event->pos().x()).arg(event->pos().y());
 9     QToolTip::showText(QCursor::pos(),posStr,this);
10 
11     mouseDeskTolLeft = event->globalPos();   // 鼠标相对于桌面左上角的位置
12     mouseWindowTopLeft = event->pos(); // 鼠标相对于窗口左上角的位置
13     if(event->buttons()& Qt::LeftButton){
14         moveTargetPso = mouseDeskTolLeft - windowDeskTopLeft;
15         qDebug()<<moveTargetPso;
16         this->move(moveTargetPso);
17     }
18 } 

设置移动窗口的位置

 1 /**
 2  * 窗口移动的位置都是相对于桌面左上角
 3  * @brief Widget::mousePressEvent
 4  * @param event
 5  */
 6 void  Widget::mousePressEvent(QMouseEvent *event)
 7 {
 8     //也可以是this->geometry().topLeft();
 9     windowDeskTopLeft = event->globalPos()-this->pos(); // 窗口左上角相对于桌面的位置
10 }

绘制时钟

 1 /**
 2  * 绘制时钟
 3  * @brief Widget::paintEvent
 4  * @param event
 5  */
 6 void Widget::paintEvent(QPaintEvent *event)
 7 {
 8     // 时针分针秒针
 9     static const QPoint hourHand[3]={
10         QPoint(7,8),
11         QPoint(-7,8),
12         QPoint(0,-30)
13     };
14     static const QPoint minuteHand[3]={
15         QPoint(7,8),
16         QPoint(-7,8),
17         QPoint(0,-60)
18     };
19     static const QPoint secondHand[3]={
20         QPoint(7,8),
21         QPoint(-7,8),
22         QPoint(0,-90)
23     };
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++){
38         paint.drawLine(QPoint(88,0),QPoint(96,0));
39         paint.rotate(30.0); // 旋转30°
40     }
41 
42     // 绘制分针刻度线 (360 / 60 = 6)
43     for(int j =0; j < 60; j++){
44         if((j%5)!=0)
45         {
46             paint.drawLine(92,0,96,0);
47         }
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(); // 还原画笔
63 
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 {
 8     static bool fullScreenFlag;
 9     if(!fullScreenFlag)
10     {
11         this->showFullScreen();
12         fullScreenFlag = true;
13     }
14     else
15     {
16         this->showNormal();
17         fullScreenFlag = false;
18     }
19 }

lcd显示时间

1 void Widget::refreshTime()
2 {
3     QTime time = QTime::currentTime();         //读出当前时间
4     QString text = time.toString("hh:mm:ss:zzz");  //格式化当前时间
5     ui->lcdNumber->display(text);              //送显示
6 }

完整代码

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 { class Widget; }
17 QT_END_NAMESPACE
18 
19 class Widget : public QWidget
20 {
21     Q_OBJECT
22 
23 public:
24     Widget(QWidget *parent = nullptr);
25     ~Widget();
26 
27 private slots:
28     void refreshTime();
29 protected:
30     void contextMenuEvent(QContextMenuEvent *event);
31     void mouseMoveEvent(QMouseEvent *event);
32     void mousePressEvent(QMouseEvent *event);
33     void paintEvent(QPaintEvent *event);
34     void mouseDoubleClickEvent(QMouseEvent *event);
35 private:
36     Ui::Widget *ui;
37 
38 private:
39     void createActions();
40     QMenu *popMenu;
41     QAction *adjustTimeAction;
42     QAction *adjustDateAction;
43     QAction *quitAction;
44 
45     QPoint windowDeskTopLeft; // 窗口左上角相对于桌面的位置
46     QPoint mouseDeskTolLeft;   // 鼠标相对于桌面左上角的位置
47     QPoint mouseWindowTopLeft; // 鼠标相对于窗口左上角的位置
48 
49     QPoint moveTargetPso; // 鼠标移动坐标
50 
51     QPainter paint;
52 };
53 #endif // WIDGET_H

widget.cpp

  1 #include "widget.h"
  2 #include "ui_widget.h"
  3 
  4 Widget::Widget(QWidget *parent)
  5     : QWidget(parent)
  6     , ui(new Ui::Widget)
  7 {
  8     ui->setupUi(this);
  9     this->setWindowFlags(Qt::FramelessWindowHint); // 隐藏边框
 10     QTimer *timer = new QTimer(this);
 11     connect(timer, SIGNAL(timeout()), this, SLOT(refreshTime()));
 12     timer->start(1);  //1毫秒定时器
 13     //   timer->setInterval(1);// 间隔1毫秒
 14     //   timer->start();
 15     
 16     this->createActions();
 17     this->setMouseTracking(true); // 实时跟踪鼠标
 18     connect(timer, SIGNAL(timeout()), this, SLOT(update()));
 19 }
 20 
 21 Widget::~Widget()
 22 {
 23     delete ui;
 24 }
 25 
 26 void Widget::refreshTime()
 27 {
 28     QTime time = QTime::currentTime();         //读出当前时间
 29     QString text = time.toString("hh:mm:ss:zzz");  //格式化当前时间
 30     ui->lcdNumber->display(text);              //送显示
 31 }
 32 
 33 /**
 34  * 右键菜单接口
 35  * @brief Widget::contextMenuEvent
 36  * @param event
 37  */
 38 void Widget::contextMenuEvent(QContextMenuEvent *event)
 39 {
 40     qDebug()<<"右键菜单";
 41     popMenu->clear(); // 清楚原有菜单
 42     popMenu->addAction(adjustTimeAction);
 43     popMenu->addAction(adjustDateAction);
 44     popMenu->addAction(quitAction);
 45     popMenu->exec(QCursor::pos()); // 添加模态对话框
 46 }
 47 
 48 /**
 49  * 右键菜单结构
 50  * @brief Widget::createActions
 51  */
 52 void Widget::createActions()
 53 { // 右键弹出菜单
 54     popMenu = new QMenu(this);
 55     // 设置popMenu样式表
 56     popMenu->setStyleSheet(
 57                 QString::fromUtf8("background-color: rgb(110, 0, 0);"));
 58     
 59     
 60     adjustTimeAction=new QAction(this);
 61     adjustTimeAction->setText("修改时间");
 62     
 63     
 64     adjustDateAction=new QAction(this);
 65     adjustDateAction->setText("修改日期");
 66     
 67     quitAction=new QAction(this);
 68     quitAction->setText(QString::fromLocal8Bit("exit"));
 69     
 70     connect(quitAction,SIGNAL(triggered(bool)),SLOT(close()));
 71     
 72 }
 73 
 74 /**
 75  * 鼠标当前坐标 移动窗口
 76  * @brief Widget::mouseMoveEvent
 77  * @param event
 78  */
 79 void Widget::mouseMoveEvent(QMouseEvent *event)
 80 {
 81     QString posStr = QString("%1,%2").arg(event->pos().x()).arg(event->pos().y());
 82     QToolTip::showText(QCursor::pos(),posStr,this);
 83     
 84     mouseDeskTolLeft = event->globalPos();   // 鼠标相对于桌面左上角的位置
 85     mouseWindowTopLeft = event->pos(); // 鼠标相对于窗口左上角的位置
 86     if(event->buttons()& Qt::LeftButton){
 87         moveTargetPso = mouseDeskTolLeft - windowDeskTopLeft;
 88         qDebug()<<moveTargetPso;
 89         this->move(moveTargetPso);
 90     }
 91 }
 92 
 93 /**
 94  * 窗口移动的位置都是相对于桌面左上角
 95  * @brief Widget::mousePressEvent
 96  * @param event
 97  */
 98 void  Widget::mousePressEvent(QMouseEvent *event)
 99 {
100     //也可以是this->geometry().topLeft();
101     windowDeskTopLeft = event->globalPos()-this->pos(); // 窗口左上角相对于桌面的位置
102 }
103 
104 /**
105  * 绘制时钟
106  * @brief Widget::paintEvent
107  * @param event
108  */
109 void Widget::paintEvent(QPaintEvent *event)
110 {
111     // 时针分针秒针
112     static const QPoint hourHand[3]={
113         QPoint(7,8),
114         QPoint(-7,8),
115         QPoint(0,-30)
116     };
117     static const QPoint minuteHand[3]={
118         QPoint(7,8),
119         QPoint(-7,8),
120         QPoint(0,-60)
121     };
122     static const QPoint secondHand[3]={
123         QPoint(7,8),
124         QPoint(-7,8),
125         QPoint(0,-90)
126     };
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++){
141         paint.drawLine(QPoint(88,0),QPoint(96,0));
142         paint.rotate(30.0); // 旋转30°
143     }
144     
145     // 绘制分针刻度线 (360 / 60 = 6)
146     for(int j =0; j < 60; j++){
147         if((j%5)!=0)
148         {
149             paint.drawLine(92,0,96,0);
150         }
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();
163     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 {
183     static bool fullScreenFlag;
184     if(!fullScreenFlag)
185     {
186         this->showFullScreen();
187         fullScreenFlag = true;
188     }
189     else
190     {
191         this->showNormal();
192         fullScreenFlag = false;
193     }
194 }

标签:实战,Widget,Qt,鼠标,void,QPoint,include,event,时钟
From: https://www.cnblogs.com/ybqjymy/p/18020913

相关文章

  • Qt 项目实战:MD5工具开发
    MD介绍MD5消息摘要算法(英语:MD5Message­DigestAlgorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hashvalue),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(RonaldLinnRivest)设计,于1992年公开,用以取代MD4算法。MD5应用编辑......
  • Qt 项目实战:幸运转盘
    幸运电子转盘基础绘图通过paintEvent来绘图鼠标事件:鼠标左键单击开始旋转Timer:定时器信号与槽1#ifndefWIDGET_H2#defineWIDGET_H34#include<QWidget>5#include<QEvent>6#include<QDebug>7#include<QTimer>8#include<QTime>9#include&l......
  • Qt 使用Http协议通信
    介绍使用QT进行应用开发时,有时候需要进行客户端和服务端的网络通信,网络通信常用的一种协议就是http协议。QT对http协议进行了封装,下面将介绍两种http通信方式的使用。在使用http时需要在pro文件中添加对应的模块。QT+=networkhttp主要两种通信方式为get和post......
  • electron delphi winform wpf qt的对比
    Electron、Delphi、WinForms、WPF和Qt都是用于开发桌面应用程序的工具或框架,它们各自有一些独特的优点和适用场景。以下是对这些工具的简要对比:Electron:基于Web技术(HTML、CSS和JavaScript)的跨平台桌面应用程序开发框架。使用Chromium渲染引擎提供强大的页面渲染能力。适用......
  • OpenResty 介绍与实战讲解(nginx&lua)
    目录一、概述二、OpenResty安装三、OpenResty的工作原理四、OpenResty核心模块1)ngx_lua模块2)ngx_stream_lua模块3)ngx_http_lua_module模块4)ngx_http_headers_more模块5)ngx_http_echo模块6)ngx_http_lua_upstream模块7)ngx_http_redis模块8)ngx_http_proxy_connect_module......
  • 如何用Qt实现一个无标题栏、半透明、置顶(悬浮)的窗口
    在Qt框架中,要实现一个无标题栏、半透明、置顶(悬浮)的窗口,需要一些特定的设置和技巧。废话不多说,下面我将以DrawClient软件为例,介绍一下实现这种效果的四个要点。要点一:移除标题栏(去除关闭、最小化、最大化按钮)在窗口的构造函数中设置窗口的样式,在强调一下,一定要找构造函数中设置,......
  • FluentFTP实战:轻松操控FTP文件,创造高效传输体验
     概述:通过FluentFTP库,轻松在.NET中实现FTP功能。支持判断、创建、删除文件夹,判断文件是否存在,实现上传、下载和删除文件。简便而强大的FTP操作,提升文件传输效率。在.NET中,使用FluentFTP库可以方便地实现FTP的相关功能。以下是判断文件夹是否存在、文件夹的创建和删除、判断文......
  • Qt实用技巧:QCustomPlot做北斗GPS显示绝对位置运动轨迹和相对位置运动轨迹图的时,使图按
    需求  使用QCustomPlot绘制多个目标的北斗运行轨迹图,包括累计绝对位置图和记录时刻的相对位置图。  当前绘制存在问题:    交付客户前,公司内部自测流程发现的问题。  实际预期效果为:   原因  QCustomPlot加入数据是按照x轴排列,也可以按照y轴排列,使用图层......
  • 《安富莱嵌入式周报》第332期:铷时钟控制板,航天战斗机C++代码标准,免费开源芯片设计,在线
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版https://www.bilibili.com/video/BV1tU421d7ZK/目录:1、Rubidium铷时钟控制板2、开源小设计,简易万用表连通性测试仪3、免费开源芯片设计软件Electric4、在线电路仿......
  • QT_linux
    加载本地图片/*QPixmap类型对象*/QPixmapimage;/*加载*/image.load(":/image/cd.png");//不缩放ui->label->setScaledContents(false);//图片在标签中居中显示(水平和垂直方向均居中)ui->label->setAlignment(Qt::AlignCenter);pixbad2(":/1/bad.png");......