要实现一个时钟小程序,我们首先想到需要以下的几个东西:
1. 时针
2.时针刻度
3.分针
4.分针刻度
5.秒针
要实现这个可以继承自QWidget,并在其中的paintEvent(QPaintEvent *event)Q_DECL_OVERLOAD;重载函数中来实现
具体代码如下:
#ifndef ANALOGCLOCK_H
#define ANALOGCLOCK_H
#include<QtWidgets>
class AnalogClock : public QWidget
{
Q_OBJECT
public:
explicit AnalogClock(QWidget *parent = 0);
~AnalogClock();
signals:
public slots:
protected:
//重载函数,实现窗口的重绘
void paintEvent(QPaintEvent* evnet)Q_DECL_OVERRIDE;
};
#endif // ANALOGCLOCK_H
#include "analogclock.h"
#include<QtWidgets>
AnalogClock::AnalogClock(QWidget *parent) : QWidget(parent)
{
//构造函数,设置定时器
QTimer* timer = new QTimer(this);
connect(timer ,SIGNAL(timeout()) ,this , SLOT(update()) );
timer->start(1000);
setWindowTitle(tr("Analog Clock"));
resize(200 , 200);
}
AnalogClock::~AnalogClock()
{
}
void AnalogClock::paintEvent(QPaintEvent *evnet)
{
//时针多边形
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, -70)
};
//秒针多边形
static const QPoint secondHand[3] = {
QPoint(7 , 8),
QPoint(-7 , 8),
QPoint(0 , -90)
};
//设置颜色
QColor hourColor(127 , 0 , 127);
QColor minuteColor(0 , 127 , 127 , 191);
QColor secondColor(0 ,0 , 127 );
int side = qMin(width() , height());
//获取当前时间
QTime time = QTime::currentTime();
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.translate(width()/2 , height()/2);
painter.scale(side/200.0 , side/200.0);
painter.setPen(Qt::NoPen);
painter.setBrush(hourColor);
painter.save();
//旋转painter
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));
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);
}
painter.setPen(Qt::NoPen);
painter.setBrush(secondColor);
painter.save();
painter.rotate(6.0 *(time.second()));
painter.drawConvexPolygon(secondHand , 3);
// painter.restore();
painter.restore();
}
然后就可以在main中使用这个时钟类了,直接实例化一个对象就可以使用了
具体如下:
//#include "mainwindow.h"
#include <QApplication>
#include"analogclock.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
AnalogClock w;
w.show();
return a.exec();
}