您好,登錄后才能下訂單哦!
參考網(wǎng)上的代碼,
直接附上源碼
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);//字體大小設(shè)置為10
setFont(font);
}
CLOCK::~CLOCK()
{
}
void CLOCK::paintEvent(QPaintEvent * /* event */)
{
//下面三個數(shù)組用來定義表針的三個頂點,以便后面的填充
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(); //獲取當(dāng)前的時間
QPainter painter(this); //聲明用來繪圖用的painter
painter.setRenderHint(QPainter::Antialiasing);//繪制的圖像反鋸齒
painter.translate(width() / 2, height() / 2);//重新定位坐標起始點,把坐標原點放到窗體的中央
painter.scale(side / 300.0, side / 300.0);//設(shè)定畫布的邊界,用窗體寬高的最小值來計算時鐘的大小,防止窗體拉伸導(dǎo)致的時鐘變形以及顯示不全
painter.setPen(Qt::red); //填充時針,不需要邊線所以NoPen
QString timeStr= QTime::currentTime().toString(); //繪制當(dāng)前的時間
painter.drawText(-40,30,80,30,Qt::AlignHCenter | Qt::AlignTop, timeStr);
painter.setPen(Qt::NoPen); //填充時針,不需要邊線所以NoPen
painter.setBrush(hourColor); //畫刷顏色設(shè)定
painter.save(); //保存painter的狀態(tài),保存的是當(dāng)前的坐標狀態(tài),如果不保存,畫完之后坐標以改變不方便畫下一個
painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0))); //將painter(的”視角“)根據(jù)時間參數(shù)轉(zhuǎn)移(30° * (小時 + 分鐘 / 60))
painter.drawConvexPolygon(hourHand, 3); //填充時針的區(qū)域
painter.restore();
painter.setPen(hourColor); //下面畫表示小時的刻度,此時要用到畫筆(因為要劃線)
for (int i = 0; i < 12; ++i) {
painter.drawLine(0, -88, 0, -96); //寫上刻度數(shù)字
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);
}
//后面的跟前面的類似,分別繪制了分針和秒針,及相應(yīng)的刻度
painter.setPen(Qt::NoPen);
painter.setBrush(minuteColor);
painter.save();
painter.rotate(6.0 * (time.minute() + time.second() / 60.0)); //設(shè)旋轉(zhuǎn)(角度 = 6° * (分鐘 + 秒 / 60))
painter.drawConvexPolygon(minuteHand, 3); //填充分針部分
painter.restore();
painter.setPen(minuteColor);
for (int j = 0; j < 60; ++j) { //循環(huán)60次,繪制表盤(其實可以從1開始,到59,提高一點效率)
if ((j % 5) != 0) //判斷是否能被5整除(能被5整除表示是正點刻度,暫不繪制)
painter.drawLine(0, -92, 0, -96); //不是正點刻度,繪制長4個像素的直線
painter.rotate(6.0); //循環(huán)60次,每次旋轉(zhuǎn)6度,所以不用save和restore
}
painter.setPen(Qt::NoPen); //填充分針,不需要邊線所以NoPen
painter.setBrush(secondColor);
painter.save(); //設(shè)置畫刷顏色
painter.rotate(6.0 * time.second()); //設(shè)置旋轉(zhuǎn)(6° * 秒)
painter.drawConvexPolygon(secondHand, 3); //設(shè)置填充
painter.restore(); //恢復(fù)保存前狀態(tài)
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);//設(shè)置刻度線為粗黑
QPen thinPen(palette().foreground(), 0.5);//設(shè)置刻度線為灰
QTime time = QTime::currentTime();
painter->translate(100,100);//重新設(shè)定坐標原點
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();//復(fù)位之前的坐標系
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);//坐標軸旋轉(zhuǎn)30度
// painter->drawLine(0,-98,0,-88);
// }
/*畫刻度還有數(shù)字*/
for (int i = 1; i >= 60; ++i) {
painter->save();
painter->rotate(6*i);//坐標軸旋轉(zhuǎn)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槽函數(shù),每當(dāng)定時器時間到了1秒后,給出定時器溢出信號,觸發(fā)update槽函數(shù),該函數(shù)自動調(diào)用
paintEvent(QPaintEvent * /* event */)
,paintEvent是一個虛函數(shù),我只知道是繼承自QWidget。我們將其重寫,畫出時鐘,每秒溢出后,update槽函數(shù)都會調(diào)用一次這個函數(shù)。這個時鐘類可以直接使用。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。