Qt設(shè)計(jì)時(shí)鐘效果
作為一位Qt的初學(xué)者,也是一位編程的小白,我今天想教大家如何使用Qt來設(shè)計(jì)一個(gè)時(shí)鐘。
首先,我們要學(xué)習(xí)如何繪圖——QPainter類
QPainter通常在一個(gè)窗口的重繪事件(paint event)的處理函數(shù)paintEvent中進(jìn)行繪制。QPainter類常用的功能有以下幾類:
1)設(shè)置繪圖工具。包括設(shè)置畫筆(setPen),設(shè)置畫刷(setBrush),設(shè)置字體(setFont)以及設(shè)置背景(setBackgroundMode)。
2)繪制圖形和文字,如圖:
QPainter部分畫圖函數(shù)的實(shí)例:
//(1)繪制線段 painter->drawLine(20,20,100,120); //畫一條(20,20)到(100,120)的線段 //(2)繪制圓或者橢圓 painter->drawEllipse(20,20,210,160); //第一二個(gè)參數(shù)表示橢圓外切矩形左上角的坐標(biāo),第三四個(gè)參數(shù)表示外切矩形的寬度和高度 //(3)繪制矩形 painter->drawReact(20,20,210,160); //第一二個(gè)參數(shù)表示橢圓外切矩形左上角的坐標(biāo),第三四個(gè)參數(shù)表示矩形的寬度和高度
開始畫時(shí)鐘
1)新建基于MainWindow類的應(yīng)用程序。
2)在.h文件中添加變量和函數(shù)聲明
float radious;//時(shí)鐘半徑 int xSecond,ySecond,xHour,yHour,xMinute,yMinute; int xCenter,yCenter;// 時(shí)鐘中心坐標(biāo) int second,minute,hour;//時(shí)分秒的實(shí)際數(shù)字 void CalcPostion();//計(jì)算指針坐標(biāo)的函數(shù) void timerEvent(QTimerEvent*); void paintEvent(QPaintEvent*event); void drawClockDial(QPainter *painter);
3)在.cpp文件中添加所需的頭文件,宏定義以及計(jì)算三種指針針尖坐標(biāo)的函數(shù)
#include "mainwindow.h" #include<qmath.h> #include<QPainter> #define PI 3.14159265
void MainWindow::CalcPostion() { double minuteHandLen,secondHandLen,hourHandLen; secondHandLen=radious*0.8; minuteHandLen=radious*0.65; hourHandLen=radious*0.5;//時(shí)分秒針的長度 //秒針的位置 xSecond=xCenter+secondHandLen*cos(second*PI/30-PI/2); ySecond=yCenter+secondHandLen*sin(second*PI/30-PI/2); //分針的位置 xMinute=xCenter+minuteHandLen*cos(minute*PI/30-PI/2); yMinute=xCenter+minuteHandLen*sin(minute*PI/30-PI/2); //時(shí)針的位置 xHour=xCenter+hourHandLen*cos((hour+1.0*minute/60)*PI/6-PI/2); yHour=yCenter+hourHandLen*sin((hour+1.0*minute/60)*PI/6-PI/2); }
4)在.cpp中的構(gòu)造函數(shù)中添加初始化代碼
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { radious=200;//半徑200 xCenter=200; yCenter=200;//圓心(200,200) hour=3,minute=56,second=35;//初試時(shí)間3:56:35 CalcPostion(); startTimer(100);//方便觀察,加速10倍 resize(400,400);//窗口大小400*400 }
5)在.cpp文件中添加表盤,指針,以及進(jìn)位函數(shù)
void MainWindow::timerEvent(QTimerEvent *event) { CalcPostion();//計(jì)算位置 second++; if(second==60) { second=0; minute++; }//分增加 if (minute==60) { minute=0; hour++; }//時(shí)增加 update(); } void MainWindow::paintEvent(QPaintEvent *event) { QPainter painter(this); QPixmap map("://res/01.jpg");//加入表盤 QRect q(0,0,400,400); painter.drawPixmap(q,map,q); QPen pen; painter.drawEllipse(QPointF(200.0,200.0),radious,radious);//畫圓 painter.drawLine(xCenter,yCenter,xSecond,ySecond);//秒針 pen.setWidth(2); painter.setPen(pen); painter.drawLine(xCenter,yCenter,xMinute,yMinute);//分針 pen.setWidth(4); painter.setPen(pen); painter.drawLine(xCenter,yCenter,xHour,yHour);//時(shí)針 } MainWindow::~MainWindow() { delete ui; }
6)main文件:
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
至此,時(shí)鐘就完成了,效果圖:
總結(jié):
1)制作時(shí)鐘就是簡(jiǎn)單地二維畫圖和定時(shí)器的結(jié)合,難度不高,易上手,可以多嘗試。
2)在計(jì)算針尖的坐標(biāo)時(shí),注意Qt的坐標(biāo)X軸橫向向右為正,Y軸垂直向下為正,順時(shí)針度數(shù)增加,不然很容易算錯(cuò)。
3)添加表盤(添加圖片)在我上一個(gè)博客有詳細(xì)講解,不會(huì)的同學(xué)可以去翻翻。
文中一些理論知識(shí)選自 清華大學(xué)出版社 仇國巍 《Qt圖形界面編程入門》
最后,作為一名萌新,如果有大佬發(fā)現(xiàn)文章中有不正確的地方可以及時(shí)提出,也可以提出你們寶貴的建議,大家共同成長。
以上就是本文的全部?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í)現(xiàn)動(dòng)態(tài)時(shí)鐘
- QT5實(shí)現(xiàn)電子時(shí)鐘
相關(guān)文章
C語言自定義類型詳解(結(jié)構(gòu)體、枚舉、聯(lián)合體和位段)
這篇文章主要給大家介紹了關(guān)于C語言中結(jié)構(gòu)體、枚舉、聯(lián)合體和位段自定義類型的相關(guān)資料,分別介紹了結(jié)構(gòu)體、枚舉、聯(lián)合體和位段等四種自定義類型,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08C++11?nullptr實(shí)現(xiàn)初始化空指針
避免產(chǎn)生“野指針”最有效的方法,就是在定義指針的同時(shí)完成初始化操作,本文主要介紹了C++11?nullptr初始化空指針,感興趣的可以了解一下2022-01-01C語言運(yùn)算符的優(yōu)先級(jí)和結(jié)合性實(shí)例詳解
本文主要介紹C語言運(yùn)算符的知識(shí),這里對(duì)運(yùn)算符的優(yōu)先級(jí)和結(jié)合性做出了詳解,并附實(shí)例代碼,希望能幫助有需要的小伙伴2016-07-07C++ 動(dòng)態(tài)創(chuàng)建按鈕及 按鈕的消息響應(yīng)
這篇文章主要介紹了C++ 動(dòng)態(tài)創(chuàng)建按鈕及 按鈕的消息響應(yīng)的相關(guān)資料,需要的朋友可以參考下2015-06-06C++ DLL動(dòng)態(tài)庫的創(chuàng)建與調(diào)用(類庫,隱式調(diào)用)
本文主要介紹了C++ DLL動(dòng)態(tài)庫的創(chuàng)建與調(diào)用(類庫,隱式調(diào)用),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05