通过时钟Timer,运用坐标转换算法,可以方便做一个简单的钟表。
坐标系
https://blog.csdn.net/fanyun_01/article/details/53129781
添加要用的头文件
#include <QTime>
#include <QTimer>
#include <QPainter>
重写paintEvent绘画虚函数
virtual void paintEvent(QPaintEvent* event);
添加一个slot,用于时钟更新
public slots:
void updateWindow();
在paintEvent添加代码
void ClockDialog::paintEvent(QPaintEvent *event)
{
static const QPoint hourHand[4]{
QPoint(4, 4),
QPoint(-4, 4),
QPoint(-4, -40),
QPoint(4, -40)
};
static const QPoint minuteHand[3]{
QPoint(3, 3),
QPoint(-3, 3),
QPoint(0, -70)
};
static const QPoint secondHand[3]{
QPoint(2, 2),
QPoint(-2, 2),
QPoint(0, -90)
};
int side = qMin(width(), height());
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing); //防止走样
painter.translate(width()/2, height()/2);
painter.scale(side/250.0, side/250.0);
//绘制表盘刻度
for(int i=0; i<60; ++i)
{
if((i%5) != 0)
{
//painter.setPen(Qt::NoPen);
painter.setPen(QPen(Qt::black, 1, Qt::DashLine, Qt::FlatCap, Qt::MiterJoin));
//painter.setBrush(Qt::yellow);
painter.drawLine(92, 0, 96, 0);
}
else
{
//painter.setPen(Qt::NoPen);
painter.setPen(QPen(Qt::red, 2, Qt::DashLine, Qt::FlatCap, Qt::MiterJoin));
//painter.setBrush(Qt::black);
painter.drawLine(86, 0, 96, 0);
}
painter.rotate(6.0);
}
QTime time = QTime::currentTime(); //当前时间
//Draw hour hand 时针
painter.save(); //保持painter状态
painter.rotate((time.hour() * 360)/12);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::red);
painter.drawConvexPolygon(hourHand, 4);
painter.restore(); //恢复painter状态
//Draw minute hand 分针
painter.save(); //保持painter状态
painter.rotate((time.minute()*360)/60);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::green);
painter.drawConvexPolygon(minuteHand, 3);
painter.restore(); //恢复painter状态
//Draw second hand 秒针
painter.save(); //保持painter状态
painter.rotate((time.second()*360)/60);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::blue);
painter.drawConvexPolygon(secondHand, 3);
painter.restore(); //恢复painter状态
}
在构造函数上设定时钟
ClockDialog::ClockDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::ClockDialog)
{
ui->setupUi(this);
QTimer *timer = new QTimer(this);
timer->start(1000);
connect(timer, &QTimer::timeout, this, &ClockDialog::updateWindow);
}
在updateWindow上更新界面
void ClockDialog::updateWindow()
{
this->update();
}
完整代码
ClockDialog.h
#ifndef CLOCKDIALOG_H
#define CLOCKDIALOG_H
#include <QDialog>
#include <QTime>
#include <QTimer>
#include <QPainter>
namespace Ui {
class ClockDialog;
}
class ClockDialog : public QDialog
{
Q_OBJECT
public:
explicit ClockDialog(QWidget *parent = nullptr);
~ClockDialog();
virtual void paintEvent(QPaintEvent* event);
public slots:
void updateWindow();
private:
Ui::ClockDialog *ui;
};
#endif // CLOCKDIALOG_H
ClockDialog.cpp
#include "clockdialog.h"
#include "ui_clockdialog.h"
ClockDialog::ClockDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::ClockDialog)
{
ui->setupUi(this);
QTimer *timer = new QTimer(this);
timer->start(1000);
connect(timer, &QTimer::timeout, this, &ClockDialog::updateWindow);
}
ClockDialog::~ClockDialog()
{
delete ui;
}
void ClockDialog::paintEvent(QPaintEvent *event)
{
static const QPoint hourHand[4]{
QPoint(4, 4),
QPoint(-4, 4),
QPoint(-4, -40),
QPoint(4, -40)
};
static const QPoint minuteHand[3]{
QPoint(3, 3),
QPoint(-3, 3),
QPoint(0, -70)
};
static const QPoint secondHand[3]{
QPoint(2, 2),
QPoint(-2, 2),
QPoint(0, -90)
};
int side = qMin(width(), height());
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing); //防止走样
painter.translate(width()/2, height()/2);
painter.scale(side/250.0, side/250.0);
//绘制表盘刻度
for(int i=0; i<60; ++i)
{
if((i%5) != 0)
{
//painter.setPen(Qt::NoPen);
painter.setPen(QPen(Qt::black, 1, Qt::DashLine, Qt::FlatCap, Qt::MiterJoin));
//painter.setBrush(Qt::yellow);
painter.drawLine(92, 0, 96, 0);
}
else
{
//painter.setPen(Qt::NoPen);
painter.setPen(QPen(Qt::red, 2, Qt::DashLine, Qt::FlatCap, Qt::MiterJoin));
//painter.setBrush(Qt::black);
painter.drawLine(86, 0, 96, 0);
}
painter.rotate(6.0);
}
QTime time = QTime::currentTime(); //当前时间
//Draw hour hand 时针
painter.save(); //保持painter状态
painter.rotate((time.hour() * 360)/12);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::red);
painter.drawConvexPolygon(hourHand, 4);
painter.restore(); //恢复painter状态
//Draw minute hand 分针
painter.save(); //保持painter状态
painter.rotate((time.minute()*360)/60);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::green);
painter.drawConvexPolygon(minuteHand, 3);
painter.restore(); //恢复painter状态
//Draw second hand 秒针
painter.save(); //保持painter状态
painter.rotate((time.second()*360)/60);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::blue);
painter.drawConvexPolygon(secondHand, 3);
painter.restore(); //恢复painter状态
}
void ClockDialog::updateWindow()
{
this->update();
}
运行界面如下:
多谢,亲爱的美美。