C++ Qt繪制時鐘界面
首先來看一下效果:

大概就是這樣子,需要注意的是,這里你需要創(chuàng)建一個基類為Widget的界面來繪制時鐘,以至于后期你想把這個時鐘放到任意一個界面,你只需要在那個界面的ui里面添加一個widget,然后將它提升為這個時鐘界面,并設(shè)定它的大小。
widget.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include<math.h>
#include<QResizeEvent>
#include<QGroupBox>
#include<QTimer>
#include<QTime>
#include<QPainter>
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
void paintEvent(QPaintEvent *event);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QTimer *timer = new QTimer(this); //連接信號與槽
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
//設(shè)置窗體名稱與大小
setWindowTitle(tr("Clock"));
ui->setupUi(this);
resize(350,350);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
static const QPoint hourHand[3] =
{
QPoint(5, 14),
QPoint(-5, 14),
QPoint(0, -50)
};
static const QPoint minuteHand[3] =
{
QPoint(5, 14),
QPoint(-5,14),
QPoint(0, -70)
};
static const QPoint secondHand[3] =
{
QPoint(5, 14),
QPoint(-5, 14),
QPoint(0, -80)
};
static const QPoint line_long[2]=
{
QPoint(0,100),
QPoint(0,80)
};
static const QPoint line_short[2]={
QPoint(0,100),
QPoint(0,95)
};
//繪制的范圍
int side = qMin(width(), height());
//獲取當(dāng)前的時間
QTime time = QTime::currentTime();
//聲明用來繪圖用的painter
QPainter painter(this);
//繪制的圖像反鋸齒
painter.setRenderHint(QPainter::Antialiasing);
//重新定位坐標(biāo)起始點,把坐標(biāo)原點放到窗體的中央
painter.translate(width() / 2, height() / 2);
//在表盤內(nèi)添加文字(任意)
//painter.drawText(-75,-120,100,170,Qt::AlignRight,tr("ROLEX"));
//設(shè)定畫布的邊界
painter.scale(side / 200.0, side / 200.0);
//填充邊線設(shè)為黑色,也可以設(shè)置為NoPen
painter.setPen( Qt::black );
//畫刷顏色設(shè)定
painter.setBrush(Qt::black);
//保存painter的狀態(tài)
painter.save();
//設(shè)置painter的旋轉(zhuǎn)角度
painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
//填充時針的區(qū)域
painter.drawConvexPolygon(hourHand, 3);
painter.restore();
painter.setPen(Qt::black);
//12個個刻度循環(huán)
for (int i = 0; i < 12; ++i)
{
painter.drawLine(line_long[0],line_long[1]);
painter.rotate(30.0);
}
//繪制分針轉(zhuǎn)角、刻度
painter.setPen(Qt::black);
painter.setBrush(Qt::black);
painter.save();
painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
painter.drawConvexPolygon(minuteHand, 3);
painter.restore();
painter.setPen(Qt::black);
for (int j = 0; j < 60; ++j)
{
if ((j % 5) != 0)
painter.drawLine(line_short[0],line_short[1]);
painter.rotate(6.0);
}
//繪制分針轉(zhuǎn)角、刻度
painter.setPen(Qt::black);
painter.setBrush(Qt::black);
painter.save();
painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
painter.drawConvexPolygon(minuteHand, 3);
painter.restore();
painter.setPen(Qt::black);
for (int j = 0; j < 60; ++j)
{
if ((j % 5) != 0)
painter.drawLine(line_short[0],line_short[1]);
painter.rotate(6.0);
}
//繪制秒針轉(zhuǎn)角
painter.setPen(Qt::black);
painter.setBrush(Qt::black);
painter.save();
painter.rotate(6.0*time.second());
painter.drawConvexPolygon(secondHand,3);
painter.restore();
}
main.cpp文件
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
到此這篇關(guān)于C++ Qt繪制時鐘界面的文章就介紹到這了,更多相關(guān)C++ Qt繪制時鐘內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Objective-C中使用STL標(biāo)準(zhǔn)庫Queue隊列的方法詳解
這篇文章主要介紹了Objective-C中使用STL標(biāo)準(zhǔn)庫Queue隊列的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01
C++如何通過ostringstream實現(xiàn)任意類型轉(zhuǎn)string
再使用整型轉(zhuǎn)string的時候感覺有點棘手,因為itoa不是標(biāo)準(zhǔn)C里面的,而且即便是有itoa,其他類型轉(zhuǎn)string不是很方便。后來去網(wǎng)上找了一下,發(fā)現(xiàn)有一個好方法2013-09-09
C++基礎(chǔ)學(xué)習(xí)之函數(shù)重載的簡單介紹
函數(shù)重載是一種特殊情況,C++允許在同一作用域中聲明幾個類似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù)個數(shù),類型,順序)必須不同,常用來處理實現(xiàn)功能類似數(shù)據(jù)類型不同的問題。這篇文章主要給大家介紹了關(guān)于C++基礎(chǔ)學(xué)習(xí)之函數(shù)重載的相關(guān)資料,需要的朋友可以參考下2019-01-01

