1. 程式人生 > 程式設計 >Qt實現指標式時鐘 Qt實現動態時鐘

Qt實現指標式時鐘 Qt實現動態時鐘

本文例項為大家分享了Qt實現指標式時鐘、動態時鐘的具體程式碼,供大家參考,具體內容如下

先上圖:

Qt實現指標式時鐘 Qt實現動態時鐘

點選執行後首先是一個指標式時鐘視窗,點選Digital Clock->可以跳轉到數字時鐘視窗,再點選Move Clock->可以還原為指標式時鐘視窗

關於整個程式的講解都在程式碼註釋中給出,很詳細~

概要:

我設計兩個視窗,一個主視窗一個子視窗,利用按鈕+訊號與槽機制,實現兩個視窗的互相切換,其中主視窗用來顯示指標時鐘,完成三個基本要求:

1、正確顯示系統時鐘;
2、能準確定位時鐘刻度和時分秒針的位置;
3、能隨視窗大小的變化而變化;

關於主視窗的實現,首先利用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_NAMESPACE
 
class MainWindow : public QMainWindow
{
 Q_OBJECT
 
public:
 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,160,40);//設定按鈕位置
 b.setText("Digital clock->");//設定按鈕內容
 b.setStyleSheet("QPushButton{background-color: rgba(205,214,216,0);color:rgb(0,0);}");//設定按鈕樣式,rgba前三個引數同rgb,最後一個引數表示不透明度,0~1之間
 connect(&b,&QPushButton::released,&MainWindow::dealsub);//滑鼠鬆開時觸發,跳轉到處理子視窗函式
 void(sub::*funsignal)()=&sub::mysignal;
 connect(&w,funsignal,&MainWindow::changeback);//關聯訊號與槽,實現從子視窗返回到主視窗
}
 
MainWindow::~MainWindow()
{
 
}
 
void MainWindow::paintEvent(QPaintEvent *)
{
 static const QPoint hour[3] = {
  QPoint(14,15),QPoint(-14,QPoint(0,-110)
 };
 static const QPoint minute[3] = {
  QPoint(11,13),QPoint(-11,-170)
 };
 static const QPoint second[3] = {
  QPoint(7,8),QPoint(-7,-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,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,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,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));
 pen.setWidth(1);
 p.setPen(pen);
 for(int i=0;i<60;i++)
 {
  if((i%5)!=0)
  p.drawLine(0,265,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,3,3);//畫圓心
 p.restore();
 
 //表明上午還是下午
 p.setPen(Qt::black);
 if(time.hour()>=12)
 p.drawText(-6,-50,"PM");//畫文字區
 else
 p.drawText(-6,"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,140,40);//設定按鈕位置
 b1.setStyleSheet("QPushButton{background-color: rgba(205,0);}");//設定按鈕風格
 connect(&b1,&QPushButton::clicked,&sub::sentsignal);//連線訊號與槽,當點選按鈕的時候跳轉到傳送訊號函式,主視窗接收,再執行changeback()函式,即實現了跳回主視窗
 QTimer *timer1=new QTimer(this);////產生一個定時器
 timer1->start(1000);//開始定時器,每一秒鐘更新顯示時間
 connect(timer1,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();
}

THE END

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。