今天寫個簡單的時鐘的程序,秒鐘、分鐘,時鐘能夠自動的正確的顯示現在的時間,但是不能夠修改。這個程序非常簡單需要的基本知識是:
1.Qpainter類
2.QTimer
步驟:
1.先新建一個widget
2.重新定義void paintEvent(QPainter *painter)
3.定義一個畫圖的函數 void draw(QPainter *painter)
main.cpp
#include <QtGui/QApplication>
#include "timer.h"
#include<QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
Timer w;
w.show();
return a.exec();
}
timer.h
#ifndef TIMER_H
#define TIMER_H
#include <QWidget>
namespace Ui {
class Timer;
}
class Timer : public QWidget
{
Q_OBJECT
public:
explicit Timer(QWidget *parent = 0);
~Timer();
void paintEvent(QPaintEvent *);
void draw(QPainter *painter);
private:
Ui::Timer *ui;
};
#endif // TIMER_H
timer.cpp
#include "timer.h"
#include "ui_timer.h"
#include<QtGui>
Timer::Timer(QWidget *parent) :
QWidget(parent),
ui(new Ui::Timer)
{
ui->setupUi(this);
QTimer *timer = new QTimer;//新建一個定時器來定時刷新圖
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
timer->start(1000);//每隔1秒鐘重新繪制一下
setWindowTitle(tr("深海的小魚兒"));//定義widget的標題
resize(200,200);//初始固定大小為200x200
}
Timer::~Timer()
{
delete ui;
}
void Timer::paintEvent(QPaintEvent *)
{
QPainter painter(this); //定義一個畫筆
painter.setRenderHint(QPainter::Antialiasing);//開啟反轉使你畫的圖比較光滑
int side = qMin(width(), height());//取長寬的最小值來作為你放大和縮小的標準值(也就是說你的
painter.translate(width() / 2, height() / 2);//長寬是一樣的,這樣縮放時不會變形。移到中心點,這時width/height=200
painter.scale(side / 200.0, side / 200.0);
draw(&painter);//開始畫圖
}
void Timer::draw(QPainter *painter)
{
static const QPoint hourHand[3] = {
QPoint(7, 8),
QPoint(-7, 8),
QPoint(0, -40)
};//定義時針的圖像
static const QPoint minuteHand[3] = {
QPoint(7, 8),
QPoint(-7, 8),
QPoint(0, -65)
};//定義分針的圖像
static const QPoint secondHand[3] = {
QPoint(7, 8),
QPoint(-7, 8),
QPoint(0, -85)
};//定義秒針的圖像
QColor hourColor(127, 0, 127);//定義時針的顏色
QColor minuteColor(0, 127, 127, 191);//定義分針的顏色
QColor secondColor(0, 0,255);//定義秒針的顏色
QTime time = QTime::currentTime();//取系統的時間
painter->setPen(Qt::NoPen);//開始畫秒針的在系統時間的位置
painter->setBrush(secondColor);
painter->save();
painter->rotate(time.second()*6);//360/60=6
painter->drawConvexPolygon(secondHand, 3);
painter->restore();
painter->setPen(Qt::NoPen);//開始畫分針的在系統時間的位置
painter->setBrush(hourColor);
painter->save();
painter->rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
painter->drawConvexPolygon(hourHand, 3);
painter->restore();
painter->setPen(hourColor);
for (int i = 0; i < 12; ++i)
{
painter->drawLine(88, 0, 96, 0);
painter->rotate(30.0);
}
painter->setPen(Qt::NoPen);//開始畫時針的在系統時間的位置
painter->setBrush(minuteColor);
painter->save();
painter->rotate(6.0 * (time.minute() + time.second() / 60.0));
painter->drawConvexPolygon(minuteHand, 3);
painter->restore();
painter->setPen(minuteColor);
for (int j = 0; j < 60; ++j)
{
if ((j % 5) != 0)
painter->drawLine(92, 0, 96, 0);
painter->rotate(6.0);
}