Qt設計時鐘效果
作為一位Qt的初學者,也是一位編程的小白,我今天想教大家如何使用Qt來設計一個時鐘。
首先,我們要學習如何繪圖——QPainter類
QPainter通常在一個窗口的重繪事件(paint event)的處理函數(shù)paintEvent中進行繪制。QPainter類常用的功能有以下幾類:
1)設置繪圖工具。包括設置畫筆(setPen),設置畫刷(setBrush),設置字體(setFont)以及設置背景(setBackgroundMode)。
2)繪制圖形和文字,如圖:
QPainter部分畫圖函數(shù)的實例:
//(1)繪制線段 painter->drawLine(20,20,100,120); //畫一條(20,20)到(100,120)的線段 //(2)繪制圓或者橢圓 painter->drawEllipse(20,20,210,160); //第一二個參數(shù)表示橢圓外切矩形左上角的坐標,第三四個參數(shù)表示外切矩形的寬度和高度 //(3)繪制矩形 painter->drawReact(20,20,210,160); //第一二個參數(shù)表示橢圓外切矩形左上角的坐標,第三四個參數(shù)表示矩形的寬度和高度
開始畫時鐘
1)新建基于MainWindow類的應用程序。
2)在.h文件中添加變量和函數(shù)聲明
float radious;//時鐘半徑 int xSecond,ySecond,xHour,yHour,xMinute,yMinute; int xCenter,yCenter;// 時鐘中心坐標 int second,minute,hour;//時分秒的實際數(shù)字 void CalcPostion();//計算指針坐標的函數(shù) void timerEvent(QTimerEvent*); void paintEvent(QPaintEvent*event); void drawClockDial(QPainter *painter);
3)在.cpp文件中添加所需的頭文件,宏定義以及計算三種指針針尖坐標的函數(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;//時分秒針的長度 //秒針的位置 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); //時針的位置 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中的構造函數(shù)中添加初始化代碼
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { radious=200;//半徑200 xCenter=200; yCenter=200;//圓心(200,200) hour=3,minute=56,second=35;//初試時間3:56:35 CalcPostion(); startTimer(100);//方便觀察,加速10倍 resize(400,400);//窗口大小400*400 }
5)在.cpp文件中添加表盤,指針,以及進位函數(shù)
void MainWindow::timerEvent(QTimerEvent *event) { CalcPostion();//計算位置 second++; if(second==60) { second=0; minute++; }//分增加 if (minute==60) { minute=0; hour++; }//時增加 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);//時針 } 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(); }
至此,時鐘就完成了,效果圖:
總結:
1)制作時鐘就是簡單地二維畫圖和定時器的結合,難度不高,易上手,可以多嘗試。
2)在計算針尖的坐標時,注意Qt的坐標X軸橫向向右為正,Y軸垂直向下為正,順時針度數(shù)增加,不然很容易算錯。
3)添加表盤(添加圖片)在我上一個博客有詳細講解,不會的同學可以去翻翻。
文中一些理論知識選自 清華大學出版社 仇國巍 《Qt圖形界面編程入門》
最后,作為一名萌新,如果有大佬發(fā)現(xiàn)文章中有不正確的地方可以及時提出,也可以提出你們寶貴的建議,大家共同成長。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C語言自定義類型詳解(結構體、枚舉、聯(lián)合體和位段)
這篇文章主要給大家介紹了關于C語言中結構體、枚舉、聯(lián)合體和位段自定義類型的相關資料,分別介紹了結構體、枚舉、聯(lián)合體和位段等四種自定義類型,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2021-08-08C++ 動態(tài)創(chuàng)建按鈕及 按鈕的消息響應
這篇文章主要介紹了C++ 動態(tài)創(chuàng)建按鈕及 按鈕的消息響應的相關資料,需要的朋友可以參考下2015-06-06C++ DLL動態(tài)庫的創(chuàng)建與調(diào)用(類庫,隱式調(diào)用)
本文主要介紹了C++ DLL動態(tài)庫的創(chuàng)建與調(diào)用(類庫,隱式調(diào)用),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05