Qt編程實(shí)現(xiàn)小時(shí)鐘
Hello World! 學(xué)習(xí)編程語(yǔ)言的最簡(jiǎn)單最經(jīng)典的小程序,當(dāng)然Qt也不例外。在學(xué)習(xí)畫(huà)圖時(shí),我覺(jué)得寫(xiě)個(gè)時(shí)鐘小程序也是個(gè)比較好的開(kāi)始。在之前的《Matlab及Java小時(shí)》一文中,我也從寫(xiě)時(shí)鐘程序作為學(xué)習(xí)畫(huà)圖的開(kāi)始。三者之間的不同點(diǎn)在于,matlab是通過(guò)while循環(huán)來(lái)進(jìn)行重繪,Java和Qt事件來(lái)處理。實(shí)時(shí)顯示時(shí)鐘,都是通過(guò)改變指針與坐標(biāo)軸的相對(duì)位置來(lái)實(shí)現(xiàn)的。前兩者都是改變指針,而Qt是旋轉(zhuǎn)坐標(biāo)軸。具體代碼如下:
1.widget.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
protected:
void paintEvent(QPaintEvent *event);//添加重繪事件
};
#endif // WIDGET_H
2.main.cpp
#include <QtGui/QApplication>
#include "widget.h"
#include<QTextCodec>
#include<QPainter>
#include<QtGui>
#include<QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
Widget w;
w.show();
return a.exec();
}
3.widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
#include<QtGui>
#include<QDebug>
#include<QFont>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QTimer *timer = new QTimer(this);//創(chuàng)建一秒定時(shí)器
connect(timer, SIGNAL(timeout()), this, SLOT(update()));//信號(hào)與槽關(guān)聯(lián)
timer->start(1000);
setWindowTitle(tr("我的時(shí)鐘--designed by TW"));
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
int side = qMin(width(), height());//獲取窗口的較短邊的值
QPainter painter(this);//指定畫(huà)圖設(shè)備
painter.fillRect(rect(),Qt::yellow);//設(shè)置背景色
painter.setRenderHint(QPainter::Antialiasing);//開(kāi)啟抗鋸齒
painter.translate(width() / 2, height() / 2);//將坐標(biāo)移到窗口正中心
painter.scale(side / 200.0, side / 200.0);//進(jìn)行縮放
QPen pen;//設(shè)置畫(huà)筆的,寬度,樣式,顏色
pen.setWidth(2);
pen.setStyle(Qt::SolidLine);
pen.setColor(Qt::red);
painter.setPen(pen);
for (int i = 0; i < 12; ++i) //畫(huà)表盤(pán)時(shí)針刻度
{
painter.drawLine(87, 0, 95, 0);
painter.rotate(30);//將坐標(biāo)進(jìn)行順時(shí)針選擇30度
}
pen.setWidth(1);
pen.setColor(Qt::black);
painter.setPen(pen);
for (int i = 0; i < 60; ++i) //畫(huà)表盤(pán)時(shí)針刻度
{
if(i%5!=0)
painter.drawLine(90, 0, 95, 0);
painter.rotate(6);
}
pen.setColor(Qt::black);
painter.setPen(pen);
QFont font("Century");
painter.setFont(font);
//標(biāo)時(shí)刻的數(shù)值
painter.drawText(-6,-75,tr("12"));
painter.drawText(-3,80,tr("6"));
painter.drawText(75,5,tr("3"));
painter.drawText(-80,5,tr("9"));
painter.drawArc(-3,-3,6,6,0,360*16);//畫(huà)中心小圓環(huán)
/////////////////////////////////////
QTime time = QTime::currentTime();//獲取當(dāng)前系統(tǒng)時(shí)間
// qDebug()<<time.hour();
// qDebug()<<time.minute();
// qDebug()<<time.second();
//畫(huà)時(shí)針
painter.save();//在旋轉(zhuǎn)坐標(biāo)系前,保存原來(lái)坐標(biāo)系
painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
pen.setColor(Qt::green);
pen.setWidth(4);
painter.setPen(pen);
painter.drawLine(0,0,0,-60);
painter.restore();//在旋轉(zhuǎn)坐標(biāo)系后,恢復(fù)原來(lái)坐標(biāo)系
//畫(huà)分針
painter.save();
painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
pen.setColor(Qt::blue);
pen.setWidth(2);
painter.setPen(pen);
painter.drawLine(0,0,0,-80);
painter.restore();
//畫(huà)秒針
painter.save();
painter.rotate(6.0 *time.second() );
pen.setColor(Qt::red);
pen.setWidth(1);
painter.setPen(pen);
//秒針形狀由兩條直線(xiàn)和一個(gè)小圓環(huán)組成
painter.drawArc(-3,-66,6,6,0,360*16);
painter.drawLine(0,20,0,-60);
painter.drawLine(0,-66,0,-85);
painter.restore();
}
運(yùn)行結(jié)果如下圖:

以上就是本文的全部?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)簡(jiǎn)易時(shí)鐘
- Qt實(shí)現(xiàn)指針式時(shí)鐘 Qt實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘
- Qt設(shè)計(jì)時(shí)鐘效果
- QT實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘
- QT5實(shí)現(xiàn)電子時(shí)鐘
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)繪制貝塞爾曲線(xiàn)的函數(shù)
貝塞爾曲線(xiàn),又稱(chēng)貝茲曲線(xiàn)或貝濟(jì)埃曲線(xiàn),是應(yīng)用于二維圖形應(yīng)用程序的數(shù)學(xué)曲線(xiàn)。本文將利用C語(yǔ)言實(shí)現(xiàn)繪制貝塞爾曲線(xiàn)的函數(shù),需要的可以參考一下2022-12-12
C語(yǔ)言的字符函數(shù)和字符串函數(shù)詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的字符函數(shù)和字符串函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
C/C++通過(guò)HTTP實(shí)現(xiàn)文件上傳與下載的示例詳解
WinInet是 Microsoft Windows 操作系統(tǒng)中的一個(gè) API 集,用于提供對(duì) Internet 相關(guān)功能的支持,它包括了一系列的函數(shù),使得 Windows 應(yīng)用程序能夠進(jìn)行網(wǎng)絡(luò)通信、處理 HTTP 請(qǐng)求、FTP 操作等,本文給大家介紹了C/C++通過(guò)HTTP實(shí)現(xiàn)文件上傳與下載,需要的朋友可以參考下2023-12-12
C語(yǔ)言表達(dá)式求值中類(lèi)型轉(zhuǎn)換和優(yōu)先級(jí)等問(wèn)題詳解
表達(dá)式求值是一個(gè)常見(jiàn)的問(wèn)題,可以用C語(yǔ)言實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言表達(dá)式求值中類(lèi)型轉(zhuǎn)換和優(yōu)先級(jí)等問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
如何通過(guò)UltraEdit解析BMP文件內(nèi)部結(jié)構(gòu)(BMP位圖基礎(chǔ))
我們先打開(kāi)畫(huà)圖隨便畫(huà)一幅圖并采用24位bmp圖像格式保存,就得到了一張24位真彩色的位圖,下面我們來(lái)詳細(xì)分析bmp位圖的各個(gè)組成部分,感興趣的朋友跟隨小編一起看看吧2021-08-08
C++Primer筆記之關(guān)聯(lián)容器的使用詳解
本篇文章對(duì)C++Primer 關(guān)聯(lián)容器的使用進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05
c++ 隨機(jī)數(shù)問(wèn)題的相關(guān)研究
這篇文章主要介紹了c++ 隨機(jī)數(shù)問(wèn)題的相關(guān)研究,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下2021-03-03
Qt?Creator配置opencv環(huán)境的全過(guò)程記錄
最近在PC端QT下配置opencv,想著以后應(yīng)該會(huì)用到,索性記錄下,這篇文章主要給大家介紹了關(guān)于Qt?Creator配置opencv環(huán)境的相關(guān)資料,需要的朋友可以參考下2022-05-05

