QT實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘
本文實(shí)例為大家分享了QT實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘的具體代碼,供大家參考,具體內(nèi)容如下
首次學(xué)習(xí)QT,這次用QT實(shí)現(xiàn)了動(dòng)態(tài)圖的制作,并成功制作了一個(gè)簡(jiǎn)易的時(shí)鐘,效果如圖:
加快100倍效果
所用背景圖,如下(素材來(lái)源于百度圖片):
代碼,原理如下:
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); void paintEvent(QPaintEvent *event); //重載paintEvent函數(shù) void timerEvent(QTimerEvent *event); //重載timerEvent函數(shù) private: Ui::MainWindow *ui; int second=0; //該變量用來(lái)記錄秒針旋轉(zhuǎn)度數(shù) double minute=0,hour=0;//該變量分別用來(lái)記錄分針,時(shí)針旋轉(zhuǎn)度數(shù) QPixmap pic; //用來(lái)保存導(dǎo)入的背景位圖 }; #endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include<QPainter> #define PI 3.1415926 #define WIDE 1000 #define HIGHT 1000 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); resize(WIDE,HIGHT); startTimer(1000); } MainWindow::~MainWindow() { delete ui; } void MainWindow::timerEvent(QTimerEvent *event)//該函數(shù)每秒執(zhí)行一次 { second+=6; //秒針刻度+6° minute+=0.1; //秒針刻度+0.1°(秒針?biāo)俣?60) hour+=0.0016666667; //秒針刻度+0.0016666667°(秒針?biāo)俣?3600) repaint(); } void MainWindow::paintEvent(QPaintEvent *event) { QPainter painter(this); QPixmap pix(":/new/prefix1/1.png"); //導(dǎo)入背景位圖 pic=pix; QRect p(0,0,1000,1000); QRect p2(0,0,1000,1000); painter.drawPixmap(p2,pic,p); //以原有尺寸從界面(0,0)點(diǎn)繪制位圖 painter.translate(WIDE/2-10,HIGHT/2); //設(shè)置繪圖原點(diǎn)坐標(biāo)為(WIDE/2-10,HIGHT/2)(此處坐標(biāo)即為表盤(pán)中心,便于接下來(lái)的指針即刻度線繪制時(shí)的旋轉(zhuǎn)操作) painter.drawEllipse(QPoint(10,0),327,327); painter.setBrush(QBrush(QColor(0,0,0))); painter.drawEllipse(QPoint(0,0),10,10); for (int i=1;i<=12;i++) { QFont font; //設(shè)置字體 font.setPointSize(17); //設(shè)置字體大小 font.setFamily("Microsoft YaHei"); //設(shè)置字體樣式 font.setLetterSpacing(QFont::AbsoluteSpacing,0); painter.setFont(font); QString s=QString("%1").arg(i); //將int型變量i轉(zhuǎn)化為Qstring類型以便用drawText函數(shù)畫(huà)在窗口 painter.drawText(QPoint(290*cos(PI*(i-1)/6-PI/3),290*sin(PI*(i-1)/6-PI/3)+10),s); //將數(shù)字1-12在窗口畫(huà)在以原點(diǎn)為中心,290為半徑的圓上每次繪畫(huà)后角度順時(shí)針旋轉(zhuǎn)30° } for (int i=0;i<=60;i++) //表盤(pán)刻度的繪制以及顏色漸變的實(shí)現(xiàn) { painter.translate(WIDE/2,HIGHT/2); //設(shè)置繪圖原點(diǎn)為(WIDE/2,HIGHT/2) if(i*12<255) //從六點(diǎn)左邊一格的刻度開(kāi)始繪制,且每次繪制時(shí)以i為變量改變r(jià)gb顏色實(shí)現(xiàn)鐘表刻度填充色的漸變 { painter.setBrush(QBrush(QColor(0,0,i*12))); } else if(i*12>255&i*12<510) { painter.setBrush(QBrush(QColor(0,((42-i)*12)%255,0))); } else { painter.setBrush(QBrush(QColor(((63-i)*12)%255,0,0))); } if(i%5==0) //當(dāng)i為5的倍數(shù)時(shí)繪制較長(zhǎng)刻度線 繪制方法為通過(guò)rotate函數(shù)以之前設(shè)置的原點(diǎn)為旋轉(zhuǎn)軸旋轉(zhuǎn)一定角度到相應(yīng)刻度線位置 { painter.rotate(6*i); painter.drawRect(0,327,4,-30); } else { painter.rotate(6*i); painter.drawRect(0,327,2,-20); } painter.resetTransform(); //重置繪圖中心 } painter.setBrush(QBrush(QColor(0,0,0))); //設(shè)置黑色填充色 painter.translate(WIDE/2-10,HIGHT/2); //繪制秒針 painter.rotate(second); //以原點(diǎn)為軸旋轉(zhuǎn)相應(yīng)角度以指向相應(yīng)刻度 下同 painter.drawRect(-5,-320,10,320); painter.resetTransform(); painter.translate(WIDE/2-10,HIGHT/2); //繪制分針 painter.rotate(minute); painter.drawRect(-3,-300,6,300); painter.resetTransform(); painter.translate(WIDE/2-10,HIGHT/2); //繪制時(shí)針 painter.rotate(hour); painter.drawRect(-7,-180,14,180); painter.resetTransform(); }
注意點(diǎn):
1.painter.translate(WIDE/2,HIGHT/2);
設(shè)置繪圖原點(diǎn),使用后接下來(lái)的繪圖坐標(biāo)都將以括號(hào)中的坐標(biāo)為原點(diǎn)進(jìn)行繪圖,直至使用painter.resetTransform()函數(shù)
2.painter.rotate()時(shí)針指針即刻度線都是通過(guò)rotate()函數(shù)進(jìn)行旋轉(zhuǎn)繪制的
3.painter.setBrush(QBrush(QColor(0,0,0)));
QBrush()設(shè)置畫(huà)刷
QColor(0,0,0)設(shè)置rgb顏色三個(gè)參數(shù)全0為黑,全255為白,可根據(jù)個(gè)人喜好調(diào)整
4.second+=6; //秒針刻度+6°
minute+=0.1; //秒針刻度+0.1°(秒針?biāo)俣?60)
hour+=0.0016666667; //秒針刻度+0.0016666667°(秒針?biāo)俣?3600)
注意調(diào)整好時(shí)針,分針,秒針之間的關(guān)系
5.repaint()每秒需要調(diào)用repaint()函數(shù)以來(lái)重新繪制窗口部件以繪制時(shí)鐘的下一個(gè)狀態(tài)
6.其他詳細(xì)信息請(qǐng)參考代碼內(nèi)注釋
若文章有錯(cuò)誤或代碼有更優(yōu)方法歡迎批評(píng)指正
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- PyQt5使用QTimer實(shí)現(xiàn)電子時(shí)鐘
- Python+Pyqt實(shí)現(xiàn)簡(jiǎn)單GUI電子時(shí)鐘
- python+PyQT實(shí)現(xiàn)系統(tǒng)桌面時(shí)鐘
- Qt繪制簡(jiǎn)單時(shí)鐘
- QTimer與QTime實(shí)現(xiàn)電子時(shí)鐘
- Qt編程實(shí)現(xiàn)小時(shí)鐘
- Qt實(shí)現(xiàn)簡(jiǎn)易時(shí)鐘
- Qt實(shí)現(xiàn)指針式時(shí)鐘 Qt實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘
- Qt設(shè)計(jì)時(shí)鐘效果
- QT5實(shí)現(xiàn)電子時(shí)鐘
相關(guān)文章
C語(yǔ)言利用鏈表實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何利用鏈表實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-11-11C語(yǔ)言實(shí)現(xiàn)超市管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)超市管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07