绘制钟表 随系统时间变化
.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QPaintEvent>
#include <QTimer>
#include <QTime>
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
void paintEvent(QPaintEvent *event);
void timeout_slot();
private:
Ui::Widget *ui;
QTimer *timer;
QTime time;
};
#endif // WIDGET_H
.cpp文件
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QPainter>
#include <QPoint>
#include <QTimer>
#include <QTime>
#include <cmath>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
, timer(new QTimer(this))
{
ui->setupUi(this);
// 设置定时器
connect(timer, &QTimer::timeout, this, QOverload<>::of(&Widget::update));
timer->start(1000);
connect(timer,&QTimer::timeout,this,&Widget::timeout_slot);
}
Widget::~Widget()
{
delete ui;
}
// 绘制事件处理函数的定义
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true); // 开启抗锯齿
// 准备画笔
QPen pen;
pen.setStyle(Qt::SolidLine);
pen.setColor(QColor("black"));
pen.setWidth(2);
painter.setPen(pen);
// 绘制表盘外圆
int side = qMin(width(), height()); // 取宽高最小值
int radius = side / 2 - 10; // 表盘半径,留一些边距
painter.drawEllipse(QPoint(width() / 2, height() / 2), radius, radius);
// 绘制刻度
pen.setWidth(1);
for (int i = 0; i < 12; ++i) {
double angle = (i * 30.0) * M_PI / 180.0; // 30度为一个刻度
int x = width() / 2 + radius * 0.9 * cos(angle - M_PI / 2); // 刻度稍微内缩,并且调整角度以匹配Qt坐标系
int y = height() / 2 - radius * 0.9 * sin(angle - M_PI / 2);
painter.drawEllipse(QPoint(x, y), 10, 10); // 绘制刻度点
}
// 获取当前时间
QTime time = QTime::currentTime();
// 绘制时针
pen.setWidth(4);
pen.setColor(Qt::darkYellow);
painter.setPen(pen);
double hourAngle = (time.hour() % 12 + time.minute() / 60.0) * 30.0 * M_PI / 180.0;
hourAngle = -hourAngle + M_PI;
int hourLength = radius * 0.5; // 时针长度
int hourX = width() / 2 + hourLength * cos(hourAngle - M_PI / 2);
int hourY = height() / 2 - hourLength * sin(hourAngle - M_PI / 2);
painter.drawLine(QPoint(width() / 2, height() / 2), QPoint(hourX, hourY));
// 绘制分针
pen.setColor(Qt::blue);
pen.setWidth(3);
painter.setPen(pen);
double minuteAngle = (time.minute() + time.second() / 60.0) * 6.0 * M_PI / 180.0;
minuteAngle = -minuteAngle + M_PI;
int minuteLength = radius * 0.7; // 分针长度
int minuteX = width() / 2 + minuteLength * cos(minuteAngle - M_PI / 2);
int minuteY = height() / 2 - minuteLength * sin(minuteAngle - M_PI / 2);
painter.drawLine(QPoint(width() / 2, height() / 2), QPoint(minuteX, minuteY));
// 绘制秒针
pen.setColor(Qt::red);
pen.setWidth(1);
painter.setPen(pen);
double secondAngle = time.second() * 6.0 * M_PI / 180.0;
secondAngle = -secondAngle + M_PI;
int secondLength = radius * 0.9; // 秒针长度
int secondX = width() / 2 + secondLength * cos(secondAngle - M_PI / 2) - 2; // 秒针稍微细一些
int secondY = height() / 2 - secondLength * sin(secondAngle - M_PI / 2) - 2;
painter.drawLine(QPoint(width() / 2, height() / 2), QPoint(secondX, secondY));
// 绘制中心点
pen.setColor(Qt::black);
pen.setWidth(2);
painter.setPen(pen);
painter.drawPoint(width() / 2, height() / 2);
}
//自定义超时函数
void Widget::timeout_slot()
{
//获取系统时间
QTime sysTime=QTime::currentTime();
//将QTime类对象转变成字符串
QString tm=sysTime.toString("hh:mm:ss");
//将时间展示再ui界面上
ui->label->setText(tm);
//设置标签居中显示
ui->label->setAlignment(Qt::AlignHCenter);
}