qt day4

设置一个时钟

widget.cpp

cpp 复制代码
#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 painter(this);
    // 绘制背景
    painter.fillRect(rect(), Qt::white);
    // 获取当前时间
    QDateTime currentTime = QDateTime::currentDateTime();
    int hour = currentTime.time().hour();
    int minute = currentTime.time().minute();
    int second = currentTime.time().second();

    // 绘制刻度
    painter.save();
    painter.translate(width() / 2, height() / 2); // 将坐标系原点移到中心点
    painter.scale(width() / 200.0, height() / 200.0); // 缩放坐标系

    // 绘制小时刻度
    painter.setPen(QPen(Qt::black, 4));
    for (int i = 0; i < 12; ++i) {
        painter.drawLine(80, 0, 96, 0);
        painter.rotate(30);
    }

    // 绘制分钟刻度
    painter.setPen(QPen(Qt::black, 2));
    for (int i = 0; i < 60; ++i) {
        if (i % 5 != 0) {
            painter.drawLine(88, 0, 96, 0);
        }
        painter.rotate(6);
    }
    painter.restore();

    // 绘制时钟指针
    painter.save();
    painter.translate(width() / 2, height() / 2);
    painter.scale(width() / 200.0, height() / 200.0);
    painter.setPen(QPen(Qt::black, 6));

    // 绘制小时指针
    painter.save();
    painter.rotate(hour * 30.0 + minute * 0.5); // 每小时30度,每分钟0.5度
    painter.drawLine(-10, 0, 40, 0);
    painter.restore();

    // 绘制分钟指针
    painter.save();
    painter.rotate(minute * 6.0 + second * 0.1); // 每分钟6度,每秒0.1度
    painter.drawLine(-10, 0, 60, 0);
    painter.restore();

    // 绘制秒钟指针
    painter.save();
    painter.rotate(second * 6.0); // 每秒6度
    painter.setPen(QPen(Qt::red, 1));
    painter.setBrush(Qt::red);
    painter.drawLine(-10, 0, 80, 0);
    painter.drawEllipse(-5, -5, 10, 10); // 绘制一个小圆点表示秒钟指针的末端
    painter.restore();

    painter.restore();

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

widget.h

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtDebug>
#include <QPaintEvent>
#include <QPainter>
#include <QTimerEvent>
#include <QTime>
#include <QTimer>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    //重写绘制事件处理函数
    void paintEvent(QPaintEvent *event) override;
    void timerEvent(QTimerEvent *event) override;

private slots:
    //void timeout_slot();
private:
    Ui::Widget *ui;
    QTimer *timer;

};
#endif // WIDGET_H
相关推荐
xiaoye-duck11 分钟前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(上):初始化和全量响应
开发语言·网络·c++·语言模型
fpcc16 分钟前
跟我学c++中级篇—streambuf在glog中的应用分析
开发语言·c++
吾与谁归in18 分钟前
C#脚本工具,支持智能提示自动补全(WPF + Roslyn + AvalonEdit)
开发语言·c#·wpf
昂好的day29 分钟前
WPF 从零入门(上):WPF 是什么、XAML 语法、布局与样式全解
开发语言·c#·wpf
飞浪纪元[FWC–FE]32 分钟前
Qt 构建排错实录:从 MSB 1009 到生成器选型
开发语言·数据库·qt
fly-iot33 分钟前
【FDE知识库】(1):AI 编程时代开发语言选型分析,云使用go,企业用java,算法python,底层c
开发语言·人工智能·golang
云边有个稻草人33 分钟前
Prometheus Pushgateway教程:离线任务指标上报、Shell与Python示例、远程访问
开发语言·python·prometheus
暴走约伯35 分钟前
【VFX工具链源码拆解 01】总体架构:大型项目特效流程的程序化落地
开发语言·经验分享·3d·unity·架构·游戏引擎
C^h9 小时前
c++ string
开发语言·c++
raindayinrain10 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化