【QT】自制一个简单的时钟(跟随系统时间)

目录

源代码:

 输出结果如下:


         使用QT完成一个简单的时钟图形化界面,功能是完成了时分秒指针能够跟随系统时间移动

        设计思路:

                1、首先将时钟的边框绘制出来

                2、定义出一个定时器t1,将定时器连接到update_slot槽内,每次超时,就会自动调用timeout信号,用来更新当前的界面update();

                3、绘制时分秒,通过系统时间控制坐标的旋转,依次绘制出时间

源代码:

widegt.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTimer>
#include <QPainter>      //画家类
#include <QPaintEvent>   //绘制事件类
#include <QPen>
#include <QFont>
#include <QTime>


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 drawClockDial(QPainter *painter);           //绘制圆内里面的时刻标志


public slots:
    void update_slot();   //自定义槽函数用来处理计时器超时




private:
    Ui::Widget *ui;
    QTimer t1;            //定义一个计时器


};
#endif // WIDGET_H

main.cpp 

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

widegt.cpp

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

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

    // 1. 连接定时器信号到 update() 槽
    connect(&t1, &QTimer::timeout, this, &Widget::update_slot);

    // 2. 启动定时器,每1000毫秒(1秒)触发一次
    t1.start(1000);

    // 设置窗口没有边框和标题栏
    setWindowFlags(Qt::FramelessWindowHint);

    // 设置窗口大小为半径的两倍(直径)
    int diameter = 410; // 半径为200,直径为400
    resize(diameter, diameter);

    // 创建圆形遮罩
    QPainterPath path;
    path.addEllipse(0, 0, diameter, diameter); // 半径为宽度和高度的一半

    // 设置窗口遮罩为圆形
    setMask(path.toFillPolygon().toPolygon());
}

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

//重写自己的绘制事件处理函数
void Widget::paintEvent(QPaintEvent *event)
{
    //1、实例化一个画家
    QPainter painter(this);

    //2、准备画笔
    QPen pen;
    pen.setStyle(Qt::SolidLine);        //使用实线
    pen.setColor("pink");               //设置画笔颜色为粉色
    pen.setWidth(10);                   //设置画笔粗细为10

    //3、给画家安排上画笔
    painter.setPen(pen);

    //4、设置画笔的坐标起点:在正中心
    painter.translate(this->width()/2, this->height()/2);

    //4、绘制一个圆
    int radius = 200;
    painter.drawEllipse(QPoint(0,0), radius, radius);

    //5、给时钟内加上时刻标志以及数字
    drawClockDial(&painter);

    //6、获取当前时间
    QTime time = QTime::currentTime();

    // 绘制时针
    painter.save();
    painter.rotate(30.0 * (time.hour() + time.minute() / 60.0));     //旋转坐标角度与当前位置水平
    painter.setPen(QPen(Qt::black, 10));
    painter.drawLine(0, 0, 0, -70);
    painter.restore();

    // 绘制分针
    painter.save();
    painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
    painter.setPen(QPen(Qt::blue, 8));
    painter.drawLine(0, 0, 0, -90);
    painter.restore();

    // 绘制秒针
    painter.save();
    painter.rotate(6.0 * time.second());
    painter.setPen(QPen(Qt::red, 6));
    painter.drawLine(0, 0, 0, -110);
    painter.restore();
}


//自定义函数,为时钟内部加上时刻标志
void Widget::drawClockDial(QPainter *painter)
{
    int radius = 200;                   // 假设圆的半径为250
    int hourTickLength = 30;            // 小时刻度的长度
    int minuteTickLength = 15;          // 分钟刻度的长度

    for(int i = 0; i < 60; ++i)
    {
        painter->save();                //保存一下当前界面
        painter->rotate(6 * i);         // 坐标轴旋转6度

        // 绘制分钟刻度
        painter->drawLine(0, radius - minuteTickLength, 0, radius);

        //恢复绘制之前的状态
        painter->restore();

        if(i % 5 == 0)
        {
            // 绘制小时刻度
            painter->save();
            painter->rotate(6 * i);         // 坐标轴旋转6度
            painter->drawLine(0, radius - hourTickLength, 0, radius);
            painter->restore();

            //绘制数字

        }
    }
}

void Widget::update_slot()
{
    update();         //更新当前页面
}

 输出结果如下:

        时分秒能够跟随系统时间运动,完成一个简单的时钟功能

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值