Qt实现 指针式时钟+动态时钟 (详细注释)
生活随笔
收集整理的這篇文章主要介紹了
Qt实现 指针式时钟+动态时钟 (详细注释)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
先上效果圖:
點擊運行后首先是一個指針式時鐘窗口,點擊Digital Clock->可以跳轉到數字時鐘窗口,再點擊Move Clock->可以還原為指針式時鐘窗口
關于整個程序的講解都在代碼注釋中給出,很詳細~
概要:
我設計兩個窗口,一個主窗口一個子窗口,利用按鈕+信號與槽機制,實現兩個窗口的互相切換,其中主窗口用來顯示指針時鐘,完成三個基本要求:
- 正確顯示系統時鐘;
- 能準確定位時鐘刻度和時分秒針的位置;
- 能隨窗口大小的變化而變化;?
關于主窗口的實現,首先利用Qt自帶的時間函數?QTime::currentTime()獲取系統時間,然后利用paintEvent(QPaintEvent *)函數根據獲取到的系統時間進行時針,分針,秒針的繪畫,并且畫出對應的小時刻度線,分鐘刻度線,秒刻 ?度線,實現基本時鐘的樣式,最后加入scale()函數進行相應的比例縮放,實現時鐘能隨窗口的大小變化而變化;
關于子窗口,是我自己多加入的模塊,是一個電子時鐘,用一個lcd液晶顯示器以”時:分:秒”的格式顯示當下時間,同樣是利用自帶的時間函數QTime::currentTime()獲取當前時間并通過lcd顯示。最后將兩個窗口通過兩個按鈕連接起來,實現互相切換功能。
?
mainwindow.h(主窗口)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include<QLCDNumber>
#include<QLabel>
#include<sub.h>
#include<QPushButton>QT_BEGIN_NAMESPACE
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);//構造函數~MainWindow();//析構函數void paintEvent(QPaintEvent *);//畫時鐘函數
public:void dealsub();//轉換為子窗口void changeback();//轉換為主窗口
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"));//設置圖標QTimer *timer = new QTimer(this);//產生一個定時器connect(timer, SIGNAL(timeout()), this, SLOT(update()));//關聯定時器的信號與槽timer->start(1000);//開始定時器,每一秒鐘更新一次resize(600,600);//窗口大小b.setParent(this);//指定按鈕父對象b.setGeometry(0,0,160,40);//設置按鈕位置b.setText("Digital clock->");//設置按鈕內容b.setStyleSheet("QPushButton{background-color: rgba(205,214,216,0);color:rgb(0,0,0);}");//設置按鈕樣式,rgba前三個參數同rgb,最后一個參數表示不透明度,0~1之間connect(&b,&QPushButton::released,this,&MainWindow::dealsub);//鼠標松開時觸發,跳轉到處理子窗口函數void(sub::*funsignal)()=&sub::mysignal;connect(&w,funsignal,this,&MainWindow::changeback);//關聯信號與槽,實現從子窗口返回到主窗口
}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();//獲取系統當前時間QPainter p(this);//創建畫家對象p.setRenderHint(QPainter::Antialiasing);//防止圖形走樣p.translate(width()/2,height()/2);//平移坐標系置中心p.scale(size/600.0,size/600.0);//縮放QBrush brush;//定義畫刷brush.setColor(QColor(245,182,96));//設置畫刷顏色brush.setStyle(Qt::SolidPattern);//設置樣式QPen pen;//定義畫筆pen.setWidth(18);//設置畫筆寬度pen.setColor(QColor(205,214,216));//rgb設置顏色pen.setStyle(Qt::SolidLine);//設置風格p.setPen(pen);//將畫筆交給畫家p.drawEllipse(QPoint(0,0),280,280);//畫圓pen.setColor(Qt::white);pen.setWidth(160);//設置畫筆寬度p.setPen(pen);//將畫筆交給畫家p.drawEllipse(QPoint(0,0),160,160);//畫圓//畫時針p.setBrush(brush);//將畫刷交給畫家p.setPen(Qt::NoPen);p.save();//保存當下狀態p.rotate(30.0*(time.hour()+time.minute()/60.0));//圖形旋轉,以原點為旋轉中心,順時針水平旋轉對應時針的角度p.drawConvexPolygon(hour,3);//畫時針這個凸多邊形,第一個參數為所有的點,第二個參數為點的個數p.restore();//恢復上一次保存的結果,和save()成對出現//繪制小時線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);//畫小時線p.drawText(-5,-235,QString::number(i));//表明小時數p.rotate(30);//每畫一次旋轉30度}//畫分針p.setPen(Qt::NoPen);p.setBrush(QColor(144,199,247));p.save();//保存當下狀態p.rotate(6.0*(time.minute()+time.second()/60.0));//順時針旋轉至分針的位置p.drawConvexPolygon(minute,3);//畫分針這個凸多邊形,第一個參數為所有的點,第二個參數為點的個數p.restore();//恢復上一次保存的結果,和save()成對出現//繪制分鐘線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的倍數時不畫,因為有小時線p.rotate(6);//每畫一次旋轉6度}//畫秒線p.setPen(Qt::NoPen);p.setBrush(QColor(119,217,175));p.save();p.rotate(6*time.second());//順時針旋轉至秒針的位置p.drawConvexPolygon(second, 3);//畫秒針這個凸多邊形,第一個參數為所有的點,第二個參數為點的個數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");//畫文本區elsep.drawText(-6,-50,"AM");//畫文本區p.drawText(-60,-130,"Made By ZSR");//畫文本區
}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();//發送信號void paintEvent(QPaintEvent *event);//畫電子時鐘
signals://信號void mysignal();
public slots://槽void showtime();//顯示時間函數
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"));//設置圖標this->setWindowTitle("Digital clock");//設置窗口標題this->resize(900,500);//設置窗口大小b1.setParent(this);//指按鈕定父對象b1.setText("Move clock->");//設置按鈕內容b1.setGeometry(0,0,140,40);//設置按鈕位置b1.setStyleSheet("QPushButton{background-color: rgba(205,214,216,0);color:rgb(0,0,0);}");//設置按鈕風格connect(&b1,&QPushButton::clicked,this,&sub::sentsignal);//連接信號與槽,當點擊按鈕的時候跳轉到發送信號函數,主窗口接收,再執行changeback()函數,即實現了跳回主窗口QTimer *timer1=new QTimer(this);產生一個定時器timer1->start(1000);//開始定時器,每一秒鐘更新顯示時間connect(timer1,SIGNAL(timeout()),this,SLOT(showtime()));//關聯定時器的信號與槽,1s到即更新顯示時間lcd=new QLCDNumber();//創建一個lcd液晶顯示器lcd->setSegmentStyle(QLCDNumber::Filled);//設置顯示器風格lcd->setParent(this);//指定顯示器父對象lcd->move(0,50);//移動顯示器位置lcd->setDigitCount(8);//設置所顯示的位數為8位lcd->resize(200,50);//設置顯示器大小showtime();//顯示時間
}void sub::sentsignal()//發送信號
{emit mysignal();
}void sub::showtime()
{QTime time1=QTime::currentTime();//獲取當前時間QString text=time1.toString("hh:mm:ss");//定義時間顯示格式if((time1.second()%2)==0)text[5]=' ';//每2s冒號消失一次lcd->display(text);//lcd顯示時間
}void sub::paintEvent(QPaintEvent *event)//
{QPainter p(this);//創建一個畫家對象p.drawPixmap(rect(),QPixmap(":/new/prefix1/f8fa6c0b00b51e33e8949627d52942ea.jpg"));//設置背景圖
}
main.cpp(主函數)
#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;//創建一個主窗口w.setWindowTitle("Move clock");//設置主窗口標題w.show();//顯示主窗口return a.exec();
}
?
?
總結
以上是生活随笔為你收集整理的Qt实现 指针式时钟+动态时钟 (详细注释)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汽车主机厂自研芯片
- 下一篇: GOF23设计模式(创建型模式)单例模式