作业0911

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    startTimer(1000);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    /********************表盘**********************/
    QPainter p(this);
    p.setRenderHint(QPainter::Antialiasing);

    QPen pen;
    pen.setStyle(Qt::SolidLine);
    pen.setColor(QColor("black"));
    pen.setWidth(5);

    p.save();
    p.setPen(pen);
    p.translate(this->width()/2, this->height()/2); // 起点

    QBrush brush(QColor(255, 236, 190));
    p.setBrush(brush);
    p.drawEllipse(QPoint(0, 0), 200, 200);

    for(int i = 0; i < 12; i++) {
        double angle = -i*30+90;

        double radian = qDegreesToRadians(angle); // 将角度转换为弧度
        int x = 160 * cos(radian);
        int y = 160 * sin(radian);

        QFont font("Arial", 10);
        p.setFont(font);
        QString numberText = QString::number(i == 0 ? 12 : i); // 处理数字 12
        QRect textRect(QPoint(x - 10, -y - 10), QSize(20, 20)); // 创建一个矩形区域用于对齐
        p.drawText(textRect, Qt::AlignCenter, numberText); // 绘制数字
    }

    for(int i=0; i<60; i++) {
        if(i%5 == 0) {
            pen.setWidth(5);
            p.setPen(pen);
            p.drawLine(QPoint(190, 0), QPoint(200, 0));
        }
        else {
            pen.setWidth(3);
            p.setPen(pen);
            p.drawLine(QPoint(195, 0), QPoint(200, 0));
        }
        p.rotate(6);
    }

    // 当前时间
    double totalHours = QDateTime::currentDateTime().time().hour();
    double totalMinutes = QDateTime::currentDateTime().time().minute();
    double totalSeconds = QDateTime::currentDateTime().time().second();

    /********************时针**********************/
    QPainter p_h(this);
    p_h.setRenderHint(QPainter::Antialiasing);
    p_h.translate(this->width()/2, this->height()/2); // 起点
    QPen pen_h;
    pen_h.setStyle(Qt::SolidLine);
    pen_h.setColor(QColor("red"));
    pen_h.setWidth(8);
    p_h.setPen(pen_h);

    p_h.rotate((totalHours+totalMinutes/60+totalMinutes/3600)*30-90);   // 时针偏移
    p_h.drawLine(QPoint(0, 0), QPoint(70, 0));

    /********************分针**********************/
    QPainter p_m(this);
    p_m.setRenderHint(QPainter::Antialiasing);
    p_m.translate(this->width()/2, this->height()/2); // 起点
    QPen pen_m;
    pen_m.setStyle(Qt::SolidLine);
    pen_m.setColor(QColor("blue"));
    pen_m.setWidth(5);
    p_m.setPen(pen_m);

    p_m.rotate((totalMinutes+totalSeconds/60)*6-90);    // 分针偏移
    p_m.drawLine(QPoint(0, 0), QPoint(100, 0));

    /********************秒针**********************/
    QPainter p_s(this);
    p_s.setRenderHint(QPainter::Antialiasing);
    p_s.translate(this->width()/2, this->height()/2); // 起点
    QPen pen_s;
    pen_s.setStyle(Qt::SolidLine);
    pen_s.setColor(QColor("green"));
    pen_s.setWidth(3);
    p_s.setPen(pen_s);

    p_s.rotate(totalSeconds*6-90);  // 秒针偏移
    p_s.drawLine(QPoint(0, 0), QPoint(130, 0));
}

void Widget::timerEvent(QTimerEvent *event)
{
    update();
}

思维导图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值