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

news2024/9/24 17:16:26

目录

源代码:

 输出结果如下:


         使用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.coloradmin.cn/o/2126478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS 常用元素属性

CSS 属性有很多, 可以参考文档 CSS 参考手册 1. 字体属性 设置字体 多个字体之间使用逗号分隔. (从左到右查找字体, 如果都找不到, 会使用默认字体. )如果字体名有空格, 使用引号包裹.建议使用常见字体, 否则兼容性不好. <style>.one {font-family:"Microsoft Ya…

Docker数据卷介绍及相关操作

数据卷的介绍 数据卷&#xff08;Data Volumes&#xff09;&#xff1a;是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。 对数据卷的修改会立马生效数据卷可以在容器之间共享和重用对数据卷的更新&#xff0c;不会影响镜像数据卷默认会一直存在&#xf…

Element UI:初步探索 Vue.js 的高效 UI 框架

Element UI&#xff1a;初步探索 Vue.js 的高效 UI 框架 一 . ElementUI 基本使用1.1 Element 介绍1.2 Element 快速入门1.3 基础布局1.4 容器布局1.5 表单组件1.6 表格组件1.6.1 基础表格1.6.2 带斑马纹表格1.6.3 带边框表格1.6.4 带状态的表格 1.7 导航栏组件讲解 二 . 学生列…

动态规划(一)——斐波那契数列模型

文章目录 斐波那契数列模型第N个泰波那契数 补充&#xff1a;空间优化——滚动数组三步问题最小花费爬楼梯解码方法 斐波那契数列模型 回头总结&#xff1a; 斐波那契数列模型一般都是线性dp&#xff0c;对于这类DP题目的状态表示一般是 以i为结尾&#xff0c;… 分析状态转移方…

google vr 入门之VrPanoramaView制作全景图列表(1)

展示图片的列表我这里使用RecycleView&#xff0c;activity_main.xml <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android“http://schemas.android.com/apk/res/android” xmlns:tools“http://schemas.android.com/tool…

又一个iPhone时代开始

今年的苹果秋季发布会在昨晚召开了&#xff0c;今天早上我们也看到了很多相关的新闻。我猜你看完后的感觉可能是&#xff0c;这不过又是一次普普通通的参数升级。又是提升了百分之多少&#xff0c;又是增加了多少倍——非常简单的一些更新。比如说芯片升级了、相机的摄像头一会…

【机器学习】7 ——k近邻算法

机器学习7——k近邻 输入&#xff1a;实例的特征向量 输出&#xff1a;类别 懒惰学习&#xff08;lazy learning&#xff09;的代表算法 文章目录 机器学习7——k近邻1.k近邻2.模型——距离&#xff0c;k&#xff0c;分类规则2.1距离——相似程度的反映2.2 k值分类规则 算法实…

Datawhale X 李宏毅苹果书 AI夏令营 《深度学习详解》第十九章 ChatGPT

19.1 ChatGPT 简介和功能 1、对话框可以输入任何东西 2、可以继续追问 19.2 对于 ChatGPT 的误解 1、第一个误解是 ChatGPT 的回答是罐头讯息 2、另外一个常见的误解是 ChatGPT 的答案是网络搜索的结果 3、那 ChatGPT 真正在做的事情是什么呢&#xff1f;一言以蔽之就是做…

【F179】基于Springboot+vue实现的幼儿园管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 系统管理也都将通过计算机进行整体智能化操作&#xff…

Adobe Acrobat DC无法将图片转换成PDF?教你用Python快速解决,最后附上集成小程序!

存在问题 当用Adobe Acrobat DC想将图片转换成PDF的时候&#xff0c;有时候会报错&#xff0c;如下&#xff1a; 多次尝试还是出现这个问题。 解决方案 基于Python代码实现 from PIL import Image import osdef images_to_pdf(input_folder, output_pdf):""&quo…

Emlog程序屏蔽用户IP拉黑名单插件

插件介绍 在很多时候我们需要得到用户的真实IP地址&#xff0c;例如&#xff0c;日志记录&#xff0c;地理定位&#xff0c;将用户信息&#xff0c;网站数据分析等,其实获取IP地址很简单&#xff0c;感兴趣的可以参考一下。 今天给大家带来舍力写的emlog插件&#xff1a;屏蔽…

【办公类】大组工会学习(文心一言+Python批量)

背景需求&#xff1a; 每学期要写一份工会的大组政治学习读后感&#xff08;9月-1月&#xff0c;共5次&#xff09; 学习内容 9月、10月、11月、12月、1月的学习内容文字稿 在班级里&#xff0c;我擅长电脑工作&#xff0c;所以这种写的工作都包了。 中2班三位老师一共写3篇&…

社区版IDEA连接MySQL数据库以及使用的详细方法

1、下载插件 由于社区版没有为我们提供DataBase&#xff0c;所有需要我们自己去下载DataBase插件。 步骤如下&#xff1a;1、File->Settings &#xff08;图片序号标错&#xff09;2、Plugins->搜索DataBase Navigator&#xff0c;点击install安装&#xff0c;安装…

新火种AI|估值飙升到千亿美元!OpenAI拿什么去支撑这惊人身价?

作者&#xff1a;小岩 编辑&#xff1a;彩云 OpenAI又有大动作了。 近期&#xff0c;有消息曝出&#xff0c;OpenAI正在进行新一轮的融资。此次融资阵仗极大&#xff0c;OpenAI很可能在本轮融资后估值飙升至千亿美元&#xff0c;成为全球范围内的“超级巨头”。 千亿估值的…

【机器学习-监督学习】集成学习与梯度提升决策树

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

erlang学习: Mnesia Erlang数据库3

Mnesia数据库删除实现和事务处理 -module(test_mnesia). -include_lib("stdlib/include/qlc.hrl").-record(shop, {item, quantity, cost}). %% API -export([insert/3, select/0, select/1, delete/1, transaction/1,start/0, do_this_once/0]). start() ->mnes…

[SAP ABAP] 清空ABAP变量

使用关键字CLEAR将变量中的值设置为默认值 代码结果如下所示

Win10磁盘出现小锁和感叹号的解决办法

很多说在设置-系统安全&#xff0c;但是我的么有&#xff0c;只能上命令了&#xff0c;管理员身份运行powerShell: su 速度比较慢&#xff0c;耐心等待会&#xff0c;每次查看状态加密的百分比都是减少哦 manage-bde -off G: manage-bde -status

JS获取URL参数的几种方法

JS获取URL参数的几种方法 在Web开发中&#xff0c;经常需要从URL中提取参数来进行相应的操作。本文将深度解析在JavaScript中获取URL参数的几种方法&#xff0c;并附带一些扩展与高级技巧。希望对你有所帮助&#xff01; 一、JS获取URL参数包含哪些方式 1. 使用URL对象 现代浏览…

BCLinux您的授权码是无效的,请获得正确的授权码来注册大云Linux操作系统

更新yum源老弹出这个&#xff0c;很烦人。 [rootlocalhost yum.repos.d]# yum clean all 服务器检查结果: ***信息***您的授权码是无效的&#xff0c;请获得正确的授权码来注册大云Linux操作系统。您可以使用bclinux-license -g命令获得机器码&#xff0c;然后与我们联系帮您产…