当前位置: 首页 > article >正文

【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();         //更新当前页面
}

 输出结果如下:

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


http://www.kler.cn/a/305900.html

相关文章:

  • 随机数
  • 卷积、频域乘积和矩阵向量乘积三种形式之间的等价关系与转换
  • 三周精通FastAPI:37 包含 WSGI - Flask,Django,Pyramid 以及其它
  • 网络技术-定义配置ACL规则的语法和命令
  • 深入解析贪心算法及其应用实例
  • Linux源码阅读笔记-V4L2框架基础介绍
  • 9.15javaweb项目总结
  • vs code: pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本
  • 【计网】从零开始使用UDP进行socket编程 --- 服务端业务实现
  • 在 Java 中实现 Kafka Producer 的单例模式
  • Java实现建造者模式和源码中的应用
  • 俄罗斯方块——C语言实践(Dev-Cpp)
  • random.randrange与torch.arange的用法
  • Spring 源码解读:自定义实现BeanPostProcessor的扩展点
  • 热门远程控制工具大盘点,职场必备
  • Java架构师实战篇Redis亿级数据统计方案
  • 【智路】智路OS Perception Camera Service
  • 【JAVA开源】基于Vue和SpringBoot的在线旅游网站
  • sheng的学习笔记-AI-FOIL(First-Order Inductive Learner)
  • conda、anaconda、pip、torch、pytorch、tensorflow到底是什么东西?(转载自本人的知乎回答)
  • php转职golang第一期
  • 深度学习-物体检测YOLO(You only look once)
  • 【SQL】百题计划:SQL对于空值的比较判断。
  • Linux学习笔记8 理解Ubuntu网络管理,做自己网络的主人
  • 一家电子元件企业终止,业绩规模小,疑似通过收购调节收入利润
  • 大数据-136 - ClickHouse 集群 表引擎详解1 - 日志、Log、Memory、Merge