網(wǎng)站首頁 編程語言 正文
本文實例為大家分享了Qt實現(xiàn)電子時鐘的具體代碼,供大家參考,具體內(nèi)容如下
進一步認識Qt中的屬性,我們現(xiàn)在再做一個小練習,去實現(xiàn)一個簡易版電子時鐘的效果。
效果展示:
新建項目:
我們創(chuàng)建了lcdclock2類,其實是沒有用到的,實際上是添加新一個C++文件來實現(xiàn)電子鐘。
添加C++文件:
代碼:
clock.h
#ifndef CLOCK_H
#define CLOCK_H
?
#include <QDialog>
?
class clock : public QDialog
{
? ? Q_OBJECT
?
public:
? ? clock(QWidget *parent = 0);
? ? ~clock();
};
?
#endif // CLOCK_H
這個clock文件沒有啥用處,其實就是為了創(chuàng)建對話框存在的。
digitalclock.h
#ifndef DIGITALCLOCK_H
#define DIGITALCLOCK_H
#include<QLCDNumber>
?
class digitalclock : public QLCDNumber
{
? ? Q_OBJECT
public:
? ? digitalclock(QWidget* parent=0);
protected:
? ? void mousePressEvent(QMouseEvent* event);
? ? void mouseMoveEvent(QMouseEvent* event);
private slots:
? ? void showTime();
private:
? ? QPoint m_dragPosition;
? ? bool m_showColon;
};
?
#endif // DIGITALCLOCK_H
添加的digitalclock頭文件添加頭文件QLCDNumber,在添加元對象系統(tǒng),這個是必要的。接著需要重寫鼠標點擊事件mousePressEvent還有mouseMoveEvent鼠標移動事件。再寫一個槽函數(shù)用來顯示時間,就是將時間打印到對話框里面。這里有兩個私有變量一個是m_dragPosition用來保存鼠標點擊點到窗口左上方的位置距離。另外有一個變量是bool類型 m_showColon用來保存冒號出現(xiàn)的狀態(tài),達到頻閃狀態(tài)。
clock.cpp
#include "clock.h"
?
clock::clock(QWidget *parent)
? ? : QDialog(parent)
{
}
?
clock::~clock()
{
?
}
digitalclock.cpp
#include "digitalclock.h"
#include<QMouseEvent>
#include<QDebug>
#include<QTime>
#include<QTimer>
digitalclock::digitalclock(QWidget* parent):QLCDNumber(parent)
{
?
? ? //設(shè)置藍色背景
? ? QPalette p=palette();//palette函數(shù)返回一個調(diào)色板
? ? p.setColor(QPalette::Window,Qt::blue);
? ? setPalette(p);//將獲取的調(diào)色板設(shè)置為窗體的顏色
?
? ? //設(shè)置邊框格式
? ? setWindowFlags(Qt::FramelessWindowHint);
?
? ? //設(shè)置窗體透明度
? ? setWindowOpacity(0.5);
?
? ? QTimer* timer=new QTimer(this);
? ? connect(timer,&QTimer::timeout,this,&digitalclock::showTime);
? ? timer->start(1000);//設(shè)置計時器周期
?
? ? showTime();
? ? resize(200,100);
? ? m_showColon=true;
}
?
void digitalclock::mousePressEvent(QMouseEvent *event)
{
? ? if(event->button()==Qt::LeftButton){
? ? ? ? m_dragPosition=event->globalPos()-frameGeometry().topLeft();
? ? ? ? qDebug()<<"全局坐標:"<<event->globalPos();
? ? ? ? qDebug()<<"左上角坐標"<<frameGeometry().topLeft();
? ? ? ? event->accept();
? ? }else{
? ? ? ? close();//關(guān)閉窗口
?
? ? }
?
}
?
void digitalclock::mouseMoveEvent(QMouseEvent *event)
{
? ? if(event->buttons()==Qt::LeftButton){
?
? ? ? ? move(event->globalPos()-m_dragPosition);
? ? ? ? //移動電子時鐘,move函數(shù)實際是根據(jù)窗口左上角為焦點來移動,如果不減去鼠標和左上角的偏移值,窗口會自動偏移
?
? ? ? ? event->accept();
? ? }
?
}
?
void digitalclock::showTime()
{
? ? QTime time=QTime::currentTime();//定義一個時間對象,獲取當前的時間
? ? QString strTime=time.toString("hh:mm");//將時間轉(zhuǎn)為字符串,并且指定格式
? ? if(m_showColon){
? ? ? ? strTime[2]=':';
? ? }else{
? ? ? ? strTime[2]=' ';
? ? }
? ? display(strTime);
? ? m_showColon=!m_showColon;//將冒號的顯示狀態(tài)設(shè)置為與之前想反,這樣就達到頻閃的樣子
?
}
構(gòu)造函數(shù):
首先定義一個調(diào)色板對象,利用palette()函數(shù)返回一個調(diào)色板。在利用調(diào)色板的函數(shù)setColror(顏色類型,顏色);設(shè)置窗體風格函數(shù)用到setWIndowFlags();設(shè)置窗體透明度函數(shù)是setWIndowOpacity函數(shù)。緊接著再定義一個計時器QTimer.再將計時器與showTIme槽函數(shù)聯(lián)系起來,每當計時器的時間到的時候就調(diào)用槽函數(shù),之后再利用resize函數(shù)將窗口的大小重新設(shè)置。首先將冒號顯示狀態(tài)設(shè)置為真。
鼠標點擊函數(shù)mousePreessEvent函數(shù):
首先判斷鼠標是否為左鍵點擊,如果是那就將鼠標點擊的點和窗口左上角點的距離計算出來,保存在m_dragposition。每次到函數(shù)結(jié)尾的時候一定要帶上event.accept接受函數(shù)修改。
鼠標移動事件mouseMoveEvent函數(shù):
首先判斷鼠標左鍵是否被點擊,因為通常的情況下,鼠標的移動是按左鍵拖動的,move函數(shù)實際是以窗口的左上方為焦點的,如果我們單純傳鼠標的全局坐標,那這樣窗口的左上方會跳動到鼠標的點擊點。這樣就不好看,所以在傳進坐標的時候,就是傳鼠標點擊的點減去窗口左上方相對于鼠標按下的偏移位置。
時間顯示函數(shù)showTIme函數(shù):
時間顯示函數(shù)就是定義一個時間對象,利用QTime::Current函數(shù)獲取當前的時間。在將時間轉(zhuǎn)成指定的格式字符串,緊接著判斷冒號的顯示狀態(tài),將冒號根據(jù)狀態(tài)設(shè)置有無。顯示時間真正的函數(shù)是display函數(shù),將時間字符串打印到窗口內(nèi)。之后再將冒號狀態(tài)取反,達到每個一秒頻閃。
mian.cpp
#include "clock.h"
#include <QApplication>
#include"digitalclock.h"
int main(int argc, char *argv[])
{
? ? QApplication a(argc, argv);
? ? digitalclock w;
? ? w.show();
?
? ? return a.exec();
}
原文鏈接:https://blog.csdn.net/qq_45775342/article/details/108154603
相關(guān)推薦
- 2022-02-27 uniapp swiper內(nèi)有點擊事件時會觸發(fā) swiper的animationfinish事件
- 2022-06-02 Go語言的變量定義詳情_Golang
- 2022-09-30 react?redux的原理以及基礎(chǔ)使用講解_React
- 2023-05-29 批標準化層?tf.keras.layers.Batchnormalization()解析_pytho
- 2022-12-12 Android?Google?AutoService框架使用詳解_Android
- 2022-09-26 利用QDir實現(xiàn)刪除選定文件目錄下的空文件夾_C 語言
- 2022-05-25 python3?字符串str和bytes相互轉(zhuǎn)換_python
- 2022-10-14 C語言數(shù)據(jù)結(jié)構(gòu)之棧和隊列的實現(xiàn)及應(yīng)用_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支