參考網上的代碼,
直接附上源碼
clock.cpp
#include "clock.h"
#include <QTime>
#include <QTimer>
#include <QPainter>
#include <QDebug>
CLOCK::CLOCK(QWidget *parent)
: QWidget(parent)
{
QTimer *timer = new QTimer(this);
timer->start(1000);//一秒鐘
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
QFont font;
font.setPointSize(10);//字體大小設置為10
setFont(font);
}
CLOCK::~CLOCK()
{
}
void CLOCK::paintEvent(QPaintEvent * /* event */)
{
//下面三個數組用來定義表針的三個頂點,以便后面的填充
static const QPoint hourHand[3] = {
QPoint(3, 8),
QPoint(-3, 8),
QPoint(0, -40)
};
static const QPoint minuteHand[3] = {
QPoint(3, 8),
QPoint(-3, 8),
QPoint(0, -70)
};
static const QPoint secondHand[3] = {
QPoint(3, 8),
QPoint(-3, 8),
QPoint(0, -90)
};//秒針
//填充表針的顏色
QColor hourColor(127, 0, 127); //分針顏色(第四個表示不透明度)
QColor minuteColor(0, 127, 127, 191);
QColor secondColor(127, 127, 0, 127);
int side = qMin(width(), height()); //繪制的范圍(寬、高中最小值)
QTime time = QTime::currentTime(); //獲取當前的時間
QPainter painter(this); //聲明用來繪圖用的painter
painter.setRenderHint(QPainter::Antialiasing);//繪制的圖像反鋸齒
painter.translate(width() / 2, height() / 2);//重新定位坐標起始點,把坐標原點放到窗體的中央
painter.scale(side / 300.0, side / 300.0);//設定畫布的邊界,用窗體寬高的最小值來計算時鐘的大小,防止窗體拉伸導致的時鐘變形以及顯示不全
painter.setPen(Qt::red); //填充時針,不需要邊線所以NoPen
QString timeStr= QTime::currentTime().toString(); //繪制當前的時間
painter.drawText(-40,30,80,30,Qt::AlignHCenter | Qt::AlignTop, timeStr);
painter.setPen(Qt::NoPen); //填充時針,不需要邊線所以NoPen
painter.setBrush(hourColor); //畫刷顏色設定
painter.save(); //保存painter的狀態,保存的是當前的坐標狀態,如果不保存,畫完之后坐標以改變不方便畫下一個
painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0))); //將painter(的”視角“)根據時間參數轉移(30° * (小時 + 分鐘 / 60))
painter.drawConvexPolygon(hourHand, 3); //填充時針的區域
painter.restore();
painter.setPen(hourColor); //下面畫表示小時的刻度,此時要用到畫筆(因為要劃線)
for (int i = 0; i < 12; ++i) {
painter.drawLine(0, -88, 0, -96); //寫上刻度數字
if (i == 0) painter.drawText(-10,-88,20,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(12));
else painter.drawText(-10,-88,20,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(i));
painter.rotate(30.0);
}
//后面的跟前面的類似,分別繪制了分針和秒針,及相應的刻度
painter.setPen(Qt::NoPen);
painter.setBrush(minuteColor);
painter.save();
painter.rotate(6.0 * (time.minute() + time.second() / 60.0)); //設旋轉(角度 = 6° * (分鐘 + 秒 / 60))
painter.drawConvexPolygon(minuteHand, 3); //填充分針部分
painter.restore();
painter.setPen(minuteColor);
for (int j = 0; j < 60; ++j) { //循環60次,繪制表盤(其實可以從1開始,到59,提高一點效率)
if ((j % 5) != 0) //判斷是否能被5整除(能被5整除表示是正點刻度,暫不繪制)
painter.drawLine(0, -92, 0, -96); //不是正點刻度,繪制長4個像素的直線
painter.rotate(6.0); //循環60次,每次旋轉6度,所以不用save和restore
}
painter.setPen(Qt::NoPen); //填充分針,不需要邊線所以NoPen
painter.setBrush(secondColor);
painter.save(); //設置畫刷顏色
painter.rotate(6.0 * time.second()); //設置旋轉(6° * 秒)
painter.drawConvexPolygon(secondHand, 3); //設置填充
painter.restore(); //恢復保存前狀態
painter.setBrush(Qt::black); //畫上中心原點
painter.drawEllipse(QPoint(0,0),2,2);
painter.setBrush(Qt::NoBrush); //畫上外圓圈
painter.setPen(Qt::black);
painter.drawEllipse(QPoint(0,0),97,97);
}
void CLOCK::draw(QPainter *painter)
{
QPen thickPen(palette().foreground(), 1.5);//設置刻度線為粗黑
QPen thinPen(palette().foreground(), 0.5);//設置刻度線為灰
QTime time = QTime::currentTime();
painter->translate(100,100);//重新設定坐標原點
painter->setRenderHint(QPainter::Antialiasing);//消鋸齒
painter->setBrush(Qt::red);
painter->setPen(Qt::red);
painter->save();//保存坐標系,防止坐標系跑偏了
painter->rotate(6.0*time.second());//注意是6.0,不是6
//painter->drawConvexPolygon(sed,4);
painter->restore();//復位之前的坐標系
painter->setBrush(Qt::blue);
painter->setPen(Qt::blue);
painter->save();
painter->rotate(6.0*(time.minute()+time.second()/60.0));
//painter->drawConvexPolygon(min,4);
painter->restore();
painter->setBrush(Qt::black);
painter->setPen(Qt::black);
painter->save();
painter->rotate(30.0*(time.hour()+time.minute()/60.0));
//painter->drawConvexPolygon(hour,4);
painter->restore();
// //painter->drawLine(0,-98,0,-88);
// for(int i=0;i<</FONT>12;i++)
// {
// painter->rotate(30);//坐標軸旋轉30度
// painter->drawLine(0,-98,0,-88);
// }
/*畫刻度還有數字*/
for (int i = 1; i >= 60; ++i) {
painter->save();
painter->rotate(6*i);//坐標軸旋轉6度
if (i % 5 == 0) {
painter->setPen(thickPen);
painter->drawLine(0, -98, 0, -82);
painter->drawText(-20, -82, 40, 40,
Qt::AlignHCenter | Qt::AlignTop,
QString::number(i/5));
} else {
painter->setPen(thinPen);
painter->drawLine(0, -98, 0, -88);
}
//painter->rotate(-DegreesPerMinute);
painter->restore();
}
}
clock.h
#ifndef _CLOCK_H_
#define _CLOCK_H_
#include <QWidget>
class CLOCK : public QWidget
{
public:
CLOCK(QWidget *parent = 0);
~CLOCK();
void paintEvent(QPaintEvent * /* event */);
void draw(QPainter *painter);
};
#endif // CLOCK_H
解釋,update槽函數,每當定時器時間到了1秒后,給出定時器溢出信號,觸發update槽函數,該函數自動調用
paintEvent(QPaintEvent * /* event */)
,paintEvent是一個虛函數,我只知道是繼承自QWidget。我們將其重寫,畫出時鐘,每秒溢出后,update槽函數都會調用一次這個函數。這個時鐘類可以直接使用。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。