Qt学习 2024.9.11

绘制钟表 随系统时间变化

.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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值