Qt實(shí)現(xiàn)指針式時(shí)鐘 Qt實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘
本文實(shí)例為大家分享了Qt實(shí)現(xiàn)指針式時(shí)鐘、動(dòng)態(tài)時(shí)鐘的具體代碼,供大家參考,具體內(nèi)容如下
先上圖:
點(diǎn)擊運(yùn)行后首先是一個(gè)指針式時(shí)鐘窗口,點(diǎn)擊Digital Clock->可以跳轉(zhuǎn)到數(shù)字時(shí)鐘窗口,再點(diǎn)擊Move Clock->可以還原為指針式時(shí)鐘窗口
關(guān)于整個(gè)程序的講解都在代碼注釋中給出,很詳細(xì)~
概要:
我設(shè)計(jì)兩個(gè)窗口,一個(gè)主窗口一個(gè)子窗口,利用按鈕+信號與槽機(jī)制,實(shí)現(xiàn)兩個(gè)窗口的互相切換,其中主窗口用來顯示指針時(shí)鐘,完成三個(gè)基本要求:
1、正確顯示系統(tǒng)時(shí)鐘;
2、能準(zhǔn)確定位時(shí)鐘刻度和時(shí)分秒針的位置;
3、能隨窗口大小的變化而變化;
關(guān)于主窗口的實(shí)現(xiàn),首先利用Qt自帶的時(shí)間函數(shù)QTime::currentTime()獲取系統(tǒng)時(shí)間,然后利用paintEvent(QPaintEvent *)函數(shù)根據(jù)獲取到的系統(tǒng)時(shí)間進(jìn)行時(shí)針,分針,秒針的繪畫,并且畫出對應(yīng)的小時(shí)刻度線,分鐘刻度線,秒刻 度線,實(shí)現(xiàn)基本時(shí)鐘的樣式,最后加入scale()函數(shù)進(jìn)行相應(yīng)的比例縮放,實(shí)現(xiàn)時(shí)鐘能隨窗口的大小變化而變化;
關(guān)于子窗口,是我自己多加入的模塊,是一個(gè)電子時(shí)鐘,用一個(gè)lcd液晶顯示器以”時(shí):分:秒”的格式顯示當(dāng)下時(shí)間,同樣是利用自帶的時(shí)間函數(shù)QTime::currentTime()獲取當(dāng)前時(shí)間并通過lcd顯示。最后將兩個(gè)窗口通過兩個(gè)按鈕連接起來,實(shí)現(xiàn)互相切換功能。
mainwindow.h(主窗口)
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include<QLCDNumber> #include<QLabel> #include<sub.h> #include<QPushButton> QT_BEGIN_NAMESPACE QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr);//構(gòu)造函數(shù) ~MainWindow();//析構(gòu)函數(shù) void paintEvent(QPaintEvent *);//畫時(shí)鐘函數(shù) public: void dealsub();//轉(zhuǎn)換為子窗口 void changeback();//轉(zhuǎn)換為主窗口 private: sub w;//子窗口 QPushButton b;//按鈕 }; #endif // MAINWINDOW_H
mainwindow.cpp(主窗口)
#include "mainwindow.h" #include "ui_mainwindow.h" #include<QPainter> #include<QPen> #include<QTime> #include<QTimer> #include<QLabel> #include<QPushButton> #include<QLCDNumber> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setWindowIcon(QIcon(":/new/prefix1/v2-d858191577356128b31c88e186eea0db_r.jpg"));//設(shè)置圖標(biāo) QTimer *timer = new QTimer(this);//產(chǎn)生一個(gè)定時(shí)器 connect(timer, SIGNAL(timeout()), this, SLOT(update()));//關(guān)聯(lián)定時(shí)器的信號與槽 timer->start(1000);//開始定時(shí)器,每一秒鐘更新一次 resize(600,600);//窗口大小 b.setParent(this);//指定按鈕父對象 b.setGeometry(0,0,160,40);//設(shè)置按鈕位置 b.setText("Digital clock->");//設(shè)置按鈕內(nèi)容 b.setStyleSheet("QPushButton{background-color: rgba(205,214,216,0);color:rgb(0,0,0);}");//設(shè)置按鈕樣式,rgba前三個(gè)參數(shù)同rgb,最后一個(gè)參數(shù)表示不透明度,0~1之間 connect(&b,&QPushButton::released,this,&MainWindow::dealsub);//鼠標(biāo)松開時(shí)觸發(fā),跳轉(zhuǎn)到處理子窗口函數(shù) void(sub::*funsignal)()=&sub::mysignal; connect(&w,funsignal,this,&MainWindow::changeback);//關(guān)聯(lián)信號與槽,實(shí)現(xiàn)從子窗口返回到主窗口 } MainWindow::~MainWindow() { } void MainWindow::paintEvent(QPaintEvent *) { static const QPoint hour[3] = { QPoint(14, 15), QPoint(-14, 15), QPoint(0, -110) }; static const QPoint minute[3] = { QPoint(11, 13), QPoint(-11, 13), QPoint(0, -170) }; static const QPoint second[3] = { QPoint(7, 8), QPoint(-7, 8), QPoint(0, -210) }; int size=qMin(width(),height()); QTime time=QTime::currentTime();//獲取系統(tǒng)當(dāng)前時(shí)間 QPainter p(this);//創(chuàng)建畫家對象 p.setRenderHint(QPainter::Antialiasing);//防止圖形走樣 p.translate(width()/2,height()/2);//平移坐標(biāo)系置中心 p.scale(size/600.0,size/600.0);//縮放 QBrush brush;//定義畫刷 brush.setColor(QColor(245,182,96));//設(shè)置畫刷顏色 brush.setStyle(Qt::SolidPattern);//設(shè)置樣式 QPen pen;//定義畫筆 pen.setWidth(18);//設(shè)置畫筆寬度 pen.setColor(QColor(205,214,216));//rgb設(shè)置顏色 pen.setStyle(Qt::SolidLine);//設(shè)置風(fēng)格 p.setPen(pen);//將畫筆交給畫家 p.drawEllipse(QPoint(0,0),280,280);//畫圓 pen.setColor(Qt::white); pen.setWidth(160);//設(shè)置畫筆寬度 p.setPen(pen);//將畫筆交給畫家 p.drawEllipse(QPoint(0,0),160,160);//畫圓 //畫時(shí)針 p.setBrush(brush);//將畫刷交給畫家 p.setPen(Qt::NoPen); p.save();//保存當(dāng)下狀態(tài) p.rotate(30.0*(time.hour()+time.minute()/60.0));//圖形旋轉(zhuǎn),以原點(diǎn)為旋轉(zhuǎn)中心,順時(shí)針?biāo)叫D(zhuǎn)對應(yīng)時(shí)針的角度 p.drawConvexPolygon(hour,3);//畫時(shí)針這個(gè)凸多邊形,第一個(gè)參數(shù)為所有的點(diǎn),第二個(gè)參數(shù)為點(diǎn)的個(gè)數(shù) p.restore();//恢復(fù)上一次保存的結(jié)果,和save()成對出現(xiàn) //繪制小時(shí)線 pen.setStyle(Qt::SolidLine); pen.setWidth(5); pen.setColor(Qt::black); p.setPen(pen); for(int i=0;i<12;i++) { p.drawLine(0,268,0,276);//畫小時(shí)線 p.drawText(-5,-235,QString::number(i));//表明小時(shí)數(shù) p.rotate(30);//每畫一次旋轉(zhuǎn)30度 } //畫分針 p.setPen(Qt::NoPen); p.setBrush(QColor(144,199,247)); p.save();//保存當(dāng)下狀態(tài) p.rotate(6.0*(time.minute()+time.second()/60.0));//順時(shí)針旋轉(zhuǎn)至分針的位置 p.drawConvexPolygon(minute,3);//畫分針這個(gè)凸多邊形,第一個(gè)參數(shù)為所有的點(diǎn),第二個(gè)參數(shù)為點(diǎn)的個(gè)數(shù) p.restore();//恢復(fù)上一次保存的結(jié)果,和save()成對出現(xiàn) //繪制分鐘線 pen.setStyle(Qt::SolidLine); pen.setColor(QColor(0,0,0)); pen.setWidth(1); p.setPen(pen); for(int i=0;i<60;i++) { if((i%5)!=0) p.drawLine(0,265,0,276);//5的倍數(shù)時(shí)不畫,因?yàn)橛行r(shí)線 p.rotate(6);//每畫一次旋轉(zhuǎn)6度 } //畫秒線 p.setPen(Qt::NoPen); p.setBrush(QColor(119,217,175)); p.save(); p.rotate(6*time.second());//順時(shí)針旋轉(zhuǎn)至秒針的位置 p.drawConvexPolygon(second, 3);//畫秒針這個(gè)凸多邊形,第一個(gè)參數(shù)為所有的點(diǎn),第二個(gè)參數(shù)為點(diǎn)的個(gè)數(shù) p.restore(); //畫圓心 p.setBrush(Qt::black); p.setPen(Qt::white); p.save(); p.drawEllipse(QPoint(0,0),3,3);//畫圓心 p.restore(); //表明上午還是下午 p.setPen(Qt::black); if(time.hour()>=12) p.drawText(-6,-50,"PM");//畫文本區(qū) else p.drawText(-6,-50,"AM");//畫文本區(qū) p.drawText(-60,-130,"Made By ZSR");//畫文本區(qū) } void MainWindow::dealsub() { w.show();//顯示子窗口 this->hide();//主窗口隱藏 } void MainWindow::changeback() { w.hide();//子窗口隱藏 this->show();//顯示主窗口L }
sub.h(子窗口)
#ifndef SUB_H #define SUB_H #include <QMainWindow> #include<QPushButton> #include<QLCDNumber> class sub : public QMainWindow { Q_OBJECT public: explicit sub(QWidget *parent = nullptr); void sentsignal();//發(fā)送信號 void paintEvent(QPaintEvent *event);//畫電子時(shí)鐘 signals://信號 void mysignal(); public slots://槽 void showtime();//顯示時(shí)間函數(shù) private: QPushButton b1;//按鈕 QLCDNumber *lcd;//lcd }; #endif // SUB_H
sub.cpp(子窗口)
#include "sub.h" #include<QTime> #include<QTimer> #include<QLCDNumber> #include<QPainter> sub::sub(QWidget *parent) : QMainWindow(parent) { setWindowIcon(QIcon(":/new/prefix1/f56513788384645db768d0ec542dec33_r.jpg"));//設(shè)置圖標(biāo) this->setWindowTitle("Digital clock");//設(shè)置窗口標(biāo)題 this->resize(900,500);//設(shè)置窗口大小 b1.setParent(this);//指按鈕定父對象 b1.setText("Move clock->");//設(shè)置按鈕內(nèi)容 b1.setGeometry(0,0,140,40);//設(shè)置按鈕位置 b1.setStyleSheet("QPushButton{background-color: rgba(205,214,216,0);color:rgb(0,0,0);}");//設(shè)置按鈕風(fēng)格 connect(&b1,&QPushButton::clicked,this,&sub::sentsignal);//連接信號與槽,當(dāng)點(diǎn)擊按鈕的時(shí)候跳轉(zhuǎn)到發(fā)送信號函數(shù),主窗口接收,再執(zhí)行changeback()函數(shù),即實(shí)現(xiàn)了跳回主窗口 QTimer *timer1=new QTimer(this);////產(chǎn)生一個(gè)定時(shí)器 timer1->start(1000);//開始定時(shí)器,每一秒鐘更新顯示時(shí)間 connect(timer1,SIGNAL(timeout()),this,SLOT(showtime()));//關(guān)聯(lián)定時(shí)器的信號與槽,1s到即更新顯示時(shí)間 lcd=new QLCDNumber();//創(chuàng)建一個(gè)lcd液晶顯示器 lcd->setSegmentStyle(QLCDNumber::Filled);//設(shè)置顯示器風(fēng)格 lcd->setParent(this);//指定顯示器父對象 lcd->move(0,50);//移動(dòng)顯示器位置 lcd->setDigitCount(8);//設(shè)置所顯示的位數(shù)為8位 lcd->resize(200,50);//設(shè)置顯示器大小 showtime();//顯示時(shí)間 } void sub::sentsignal()//發(fā)送信號 { emit mysignal(); } void sub::showtime() { QTime time1=QTime::currentTime();//獲取當(dāng)前時(shí)間 QString text=time1.toString("hh:mm:ss");//定義時(shí)間顯示格式 if((time1.second()%2)==0) text[5]=' ';//每2s冒號消失一次 lcd->display(text);//lcd顯示時(shí)間 } void sub::paintEvent(QPaintEvent *event)// { QPainter p(this);//創(chuàng)建一個(gè)畫家對象 p.drawPixmap(rect(),QPixmap(":/new/prefix1/f8fa6c0b00b51e33e8949627d52942ea.jpg"));//設(shè)置背景圖 }
main.cpp(主函數(shù))
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w;//創(chuàng)建一個(gè)主窗口 w.setWindowTitle("Move clock");//設(shè)置主窗口標(biāo)題 w.show();//顯示主窗口 return a.exec(); }
THE END
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++?折疊參數(shù)包詳解(悄然增強(qiáng)編程效率)
折疊參數(shù)就是一個(gè)參數(shù)包, 代表是多個(gè)未知,tuple元組就是一個(gè)折疊參數(shù)的使用,這篇文章主要介紹了C++?折疊參數(shù)包悄然增強(qiáng)編程效率,需要的朋友可以參考下2023-05-05C語言一看就懂的選擇與循環(huán)語句及函數(shù)介紹
函數(shù)是一個(gè)功能模塊,它把實(shí)現(xiàn)某個(gè)功能的代碼塊包含起來,并起一個(gè)函數(shù)名,供別人調(diào)用,如printf函數(shù),如system函數(shù)。是程序運(yùn)行當(dāng)中包裝起來的一個(gè)步驟;選擇與循環(huán)是編程中最常用的結(jié)構(gòu),本篇文章用最簡單的文字帶你了解它們2022-04-04C語言實(shí)現(xiàn)銀行管理系統(tǒng)(文件操作)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)銀行管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C++?棧和隊(duì)列的實(shí)現(xiàn)超詳細(xì)解析
棧和隊(duì)列,嚴(yán)格意義上來說,也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為?"一對一"?的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解2022-03-03C/C++淺析鄰接表拓?fù)渑判蛩惴ǖ膶?shí)現(xiàn)
這篇文章主要介紹了C/C++對于鄰接表拓?fù)渑判蛩惴ǖ膶?shí)現(xiàn),鄰接表是圖的一種鏈?zhǔn)酱鎯?chǔ)方法,其數(shù)據(jù)結(jié)構(gòu)包括兩部分:節(jié)點(diǎn)和鄰接點(diǎn)2022-07-07C/C++通過SQLite SDK實(shí)現(xiàn)數(shù)據(jù)庫增刪改查操作
SQLite,作為一款嵌入式關(guān)系型數(shù)據(jù)庫管理系統(tǒng),一直以其輕量級、零配置以及跨平臺(tái)等特性而備受青睞,本文主要介紹了C++如何通過SQLite SDK實(shí)現(xiàn)數(shù)據(jù)庫增刪改查操作,感興趣的可以了解下2023-11-11