Qt是时钟练习就是对事件简单的使用:
Widget类头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTimer>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
void paintEvent(QPaintEvent *event);
public slots:
void slotTimer();
private:
Ui::Widget *ui;
int m_value;
int m_second;
int m_minute;
int m_hour;
};
#endif // WIDGET_H
Widget类的具体实现:
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPaintEvent>
#include <QDebug>
#include <QTimer>
#include <QTime>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QTime time = QTime::currentTime();
m_hour = time.hour();
m_second = time.second();
m_minute = time.minute();
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(slotTimer()));
timer->start(1000);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.drawPixmap(rect(), QPixmap("../image/001.jpg"));
int extent;
if (width()>height())
extent = height()-20;
else
extent = width()-20;
p.translate((width()-extent)/2, (height()-extent)/2);
p.setPen(Qt::white);
p.setBrush(Qt::black);
p.drawEllipse(0, 0, extent, extent);
p.translate(extent/2, extent/2);
QFont font("TypeWriter");
font.setPixelSize(extent*0.08);
p.setFont(font);
p.setFont(font);
p.drawText(extent*0.32,extent*0.03,"3");
p.drawText(-extent*0.02,extent*0.35,"6");
p.drawText(-extent*0.36,extent*0.03,"9");
p.drawText(-extent*0.04,-extent*0.30,"12");
//*******************绘画秒针*************************//
p.save();
for(int angle=0; angle<=+ 360; angle+=30)
{
p.save();
p.rotate(angle);
p.setPen(Qt::white);
for(int i = angle - 30; i < angle; i+=6)
{
p.rotate(6);
p.drawLine(extent*0.45, 0, extent*0.48, 0);
}
QPen op(Qt::white, 4);
p.setPen(op);
p.drawLine(extent*0.4, 0, extent*0.48, 0);
p.restore(); //restore函数保存当前绘制好的画家,并返回初始位置
}
//////////////////绘制时针////////////////////////
p.rotate(m_hour * 30 + m_minute / 2 - 90);
QPolygon polygon;
//polygon << QPoint(-extent*0.05, extent*0.05) << QPoint(-extent*0.05, -extent*0.05) << QPoint(extent*0.46, 0);
QPen pen1(Qt::white,4);
//p.setPen(Qt::NoPen);
p.setPen(pen1);
p.setBrush(QColor(255,0,0,120));
//p.drawPolygon(polygon);
p.drawLine(0, 0, extent * 0.27, 0);
////////////////绘制分针/////////////////////////
QPainter p2(this);
p2.translate((width()-extent)/2, (height()-extent)/2);
p2.translate(extent/2, extent/2);
QPen pen3(Qt::white, 4);
p2.setPen(pen3);
p2.setBrush(QColor(255,0,0,120));
p2.rotate(m_minute * 6 - 90);
p2.drawLine(0, 0, extent * 0.36, 0);
////////////////绘制秒针///////////////////
QPainter p3(this);
p3.translate((width()-extent)/2, (height()-extent)/2);
p3.translate(extent/2, extent/2);
QPen pen2(Qt::white, 2);
p3.setPen(pen2);
p3.setBrush(QColor(255,0,0,120));
p3.rotate(m_second * 6 - 90);
p3.drawLine(0, 0, extent * 0.40, 0);
}
void Widget::slotTimer()
{
qDebug() << "time slot:" ;
m_second++;
if(m_second == 60)
{
m_second = 0;
m_minute++;
if(m_minute == 60)
{
m_minute = 0;
m_hour++;
}
}
this->update();
}
效果展示: