简易时钟-QT学习

news2024/9/29 11:39:20

1 .h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPaintEvent> //绘制事件
#include <QPainter> //画家类
#include <QPaintDevice>
#include <cmath> //
#include <QPainterPath>
#include <QTime> //时间类
#include <QTimer> //定时器
#include <QTimerEvent> //定时器事件
#include <QDebug>
#include <QBrush> //画刷

#define PI 3.14159

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
protected:
    void paintEvent(QPaintEvent *event) override; //重写绘制事件函数
    void timerEvent(QTimerEvent *event) override; //重写定时器事件函数
    void DrawScaleLine(QPainter& painter, QPen pain_pen); //绘制刻度线函数
    void DrawSecLine(); //绘制秒针函数
    void DrawMinuLine(); //绘制分针函数
    void DrawHourLine(); //绘制时针函数
private:
    Ui::Widget *ui;
    QTimer* timer; //定时器指针
    int sec=0, minu=0, hour=0; //用于存储时分秒
};
#endif // WIDGET_H

2 .CPP

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    timer = new QTimer(this);//实例化
    QTime time;
    sec = time.currentTime().second();//获取当前时间
    minu = time.currentTime().minute();
    hour = time.currentTime().hour();
    //qDebug() << sec << "  " << minu;
    this->startTimer(1000);//启动定时器
}

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

void Widget::paintEvent(QPaintEvent *event)
{
    //实例化一个画家类
    QPainter pt(this);
    pt.setRenderHint(QPainter::Antialiasing, true);//开启反锯齿
    //设置画笔(RGB)
    QPen pen(QColor(255,50,70));
    pen.setWidth(8);//设置画笔宽度
    pt.translate(this->width()/2,this->height()/2);//设置画笔起点
    pt.setPen(pen);
    //绘制圆
    pt.drawEllipse(QPoint(0,0), 200, 200);
    DrawScaleLine(pt, pen);//绘制刻度线
    //实例化一个画家类
    QPainter pt_1(this);
    pt_1.setRenderHint(QPainter::Antialiasing, true);//开启反锯齿
    //设置画笔(RGB)
    QPen pen_1(QColor(0,0,0));
    pen_1.setWidth(8);//设置画笔宽度
    pt_1.translate(this->width()/2,this->height()/2);//设置画笔起点
    pt_1.setPen(pen_1);
    //绘制圆
    pt_1.drawEllipse(QPoint(0,0), 8, 8);


    DrawSecLine();  //秒针
    DrawMinuLine(); //分针
    DrawHourLine(); //时针
    //让绘制事件不断的触发
    this->update();
}

//绘制刻度线函数
void Widget::DrawScaleLine(QPainter& painter,QPen pain_pen)
{
    //粗刻度线
    for(int i=0; i<12; i++) {
        pain_pen.setWidth(6);//宽度
        pain_pen.setColor("black");
        painter.setPen(pain_pen);
        painter.drawLine(QPoint(0, 180), QPoint(0, 192));
        painter.rotate(30);
    }
    //细刻度线,上下二者可%5操作(二合一for循环)
    for(int i=0; i<60; i++) {
        pain_pen.setWidth(3);
        pain_pen.setColor("black");
        painter.setPen(pain_pen);
        painter.drawLine(QPoint(0,195), QPoint(0,190));
        painter.rotate(6);
    }
    painter.end();
}

//绘制秒针函数
void Widget::DrawSecLine()
{
    QPainter psec(this);
    //设定初始位置
    psec.translate(this->width()/2,this->height()/2);
    //锯齿取消
    psec.setRenderHint(QPainter::Antialiasing,true);
    //设置每个时钟
    //颜色
    QPen sec_pen(QColor(0, 160, 230));
    //秒针宽度
    sec_pen.setWidth(2);
    //绑定画家和笔
    psec.setPen(sec_pen);
    //秒针偏移量
    psec.rotate(sec*6);
    //设定秒针长度及初始位置
    psec.drawLine(QPoint(0,0),QPoint(0,-150));
    psec.end();
}
//绘制分针
void Widget::DrawMinuLine()
{
    QPainter pmin(this);
    //设定初始位置
    pmin.translate(this->width()/2,this->height()/2);
    //锯齿取消
    pmin.setRenderHint(QPainter::Antialiasing,true);
    //分针颜色
    QPen min_pen(QColor(0, 127, 127));
    //分针宽度
    min_pen.setWidth(6);
    //绑定画家和笔
    pmin.setPen(min_pen);
    //设定分针偏移量
    pmin.rotate(minu*6+sec*0.1);
    //设定分针长度及初始
    pmin.drawLine(QPoint(0,0),QPoint(0,-120));
    pmin.end();
}
//时针
void Widget::DrawHourLine()
{
    QPainter phou(this);
    //设定初始位置
    phou.translate(this->width()/2,this->height()/2);
    //锯齿取消
    phou.setRenderHint(QPainter::Antialiasing,true);
    //时针颜色
    QPen hou_pen(QColor(200, 100, 0));
    //秒针宽度
    hou_pen.setWidth(10);
    //绑定画家和笔
    phou.setPen(hou_pen);
    //偏移大小
    phou.rotate(hour*30+minu*0.5);
    //设定时针长度及初始位置
    phou.drawLine(QPoint(0,0),QPoint(0,-80));
    phou.end();
}
//处理定时器事件
void Widget::timerEvent(QTimerEvent *event)
{
    sec++;
    if((sec % 60) == 0)//60秒进一
    {
        sec = 0;
        minu++;
        if((minu % 60) == 0)//60分进一
        {
            minu = 0;
            hour++;
            if((hour%12) == 0)//0点
            {
                hour = 0;
            }
        }
    }
}

3 展示

4 牛客网刷题

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/486121.html

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

相关文章

基于蜣螂算法的无人机航迹规划-附代码

基于蜣螂算法的无人机航迹规划 文章目录 基于蜣螂算法的无人机航迹规划1.蜣螂搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用蜣螂算法来优化无人机航迹规划。 1.蜣螂搜索算法 …

【LeetCode】646. 最长数对链

646. 最长数对链&#xff08;中等&#xff09; 思路 这道题和 300. 最长递增子序列 类似&#xff0c;我们可以定义 dp 数组&#xff0c;其中 dp[i] 表示以 i 结尾的子序列的性质。在处理好每个位置后&#xff0c;统计一遍各个位置的结果即可得到题目要求的结果。 但是题目中强…

ElasticSearch(二)简介

1. 简介 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。 它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性&#xff0c;能使数据在生产环境变得更有价值。 Elasticsearch 的实现原理主要分为以下几个步骤&#xf…

Servlet执行原理和API详解

一、HttpServlet 我们写 Servlet 代码的时候, 首先第⼀步就是先创建类, 继承⾃ HttpServlet, 并重写其中的某些方法. 1.1核心方法 1.2处理GET或POST请求 1.3数据的两种提交方式 数据提交有两种方式&#xff1a; form 表单提交ajax 提交 1.3.1form 表单提交 form表单提交的…

瑞萨e2studio(24)----电容触摸配置(1)

瑞萨e2studio.20--电容触摸配置1 概述硬件准备新建工程工程模板保存工程路径芯片配置工程模板选择时钟配置添加TOUCH驱动配置CapTouch开启调优界面启动 CapTouch 调优通过电容触摸点亮LED 概述 这篇文档将创建一个使用 e2 studio 集成 QE 的电容式触摸应用示例&#xff0c;通…

C语言函数大全-- s 开头的函数(3)

C语言函数大全 本篇介绍C语言函数大全-- s 开头的函数&#xff08;3&#xff09; 1. sleep 1.1 函数说明 函数声明函数功能unsigned int sleep(unsigned int seconds);它是 C 语言标准库中的函数&#xff0c;用于使当前进程挂起一定的时间。在挂起期间&#xff0c;操作系统…

移动宽带安装说明一(刘欣)

2023年&#xff0c;五一假期给老家和父母家安装了2次宽带&#xff0c;记录一下吧。 一、移动光改覆盖率已经很高了 从当初的铁通“FTTB”覆盖小区,网线入户的带宽只能达到100M&#xff0c;提升到现在大面积的光改完成&#xff0c;普遍是光猫&#xff08;光纤MODEL&#xff09…

网络协议与攻击模拟-04-实施ARP攻击与欺骗

实施 ARP 欺骗和攻击 一、环境 1、 kali Linux 安装一个 arpspoof 2、win10 被攻击主机 二、 kaili 配置 kali Linux 系统是基于 debian Linux 系统&#xff0c;采用 deb 包管理方式&#xff0c;可以使用 apt 的方式进行直接从源安装 1、配置源 # 官方源 # deb http:/…

FastAPI如何区分多环境:开发/测试/预发布/生产环境

1 缘起 开始用FastAPI开发项目&#xff0c; 区分环境是部署的第一步&#xff0c;因此&#xff0c;需要区分dev/test/pre/prod等环境&#xff0c; 而FastAPI刚好提供了读取环境配置文件的参数&#xff0c;可以在启动服务时指定环境配置文件的路径&#xff0c; 参数为env_file&a…

【前端技术】Vue3 01:初识 Vue.js

Vue 可以说是非常流行了&#xff0c;至少在国内是这样&#xff0c;他是个轻量级的 JavaScript 框架&#xff0c;非常适合构建大型和中小型的 Web 应用程序&#xff0c;如果想和前端打交道&#xff0c;应该绕不过这个框架吧。 目录 1 Vue.js 介绍 2 IDE 选择 2.1 vscode 2.…

libfacedetection 人脸检测库的基本使用

目录 1、源码下载 2、编译 3、构建工程 4、个人总结 运行总结&#xff1a; 与CascadeClassifier级联分类器 人脸检测 对比: 1、源码下载 直接从github上克隆项目仓库。 git clone https://github.com/ShiqiYu/libfacedetection.git2、编译 这个项目使用了cmake脚本&#…

【LeetCode】413. 等差数列划分

413. 等差数列划分&#xff08;中等&#xff09; 思路 由于题目求的是等差数列 &#xff0c;很自然想到子数组一定满足 nums[i] - nums[i-1] nums[i-1] -nums[i-2]; 。然而我们对于 dp 数组的定义通常是以 i 结尾&#xff0c;满足某些条件的子数组数量&#xff0c;而等差数组可…

【LeetCode】300. 最长递增子序列

300. 最长递增子序列&#xff08;中等&#xff09; 方法一&#xff1a;动态规划 思路 通常来说&#xff0c;子序列不要求连续&#xff0c;而子数组或子字符串必须连续&#xff1b;对于子序列问题&#xff0c;第一种动态规划方法是&#xff0c;定义 dp 数组&#xff0c;其中 dp[…

PHP语言基础

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 前言 一、变量和数据类型 二、运算符和表达式 三、条件语句 四、循环语句 前言 PHP是一种非常流行的开源服务器端脚本语言&#xff0c;广泛用于Web开发…

Python sys模块

sys:使用或维护解释器 版本信息 Python版本 >>> sys.version 3.10.3 (tags/v3.10.3:a342a49, Mar 16 2022, 13:07:40) [MSC v.1929 64 bit (AMD64)]系统版本 >>> sys.platform win32 >>> 解释器版本 >>> sys.hexversion 50988016 >&g…

TypeScript 基本概念

TypeScript 是什么&#xff1f; 目标&#xff1a;能够说出什么是 TypeScript TS 官方文档 TS 中文参考 - 不再维护 TypeScript 简称&#xff1a;TS&#xff0c;是 JavaScript 的超集&#xff0c;JS 有的 TS 都有 TypeScript Type JavaScript&#xff08;在 JS 基础之上…

Linux下文件的增删查改

1.什么是文件 文件是计算机文件属于文件的一种&#xff0c;与普通文件载体不同&#xff0c;计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。文件文件内容文件属性。 2.文件的创建 文件的创建分为两种指令&#xff1a;touch和mkdir touch是用来创建普通文件的&am…

(C语言版)力扣(LeetCode)数组相关面试题OJ题解析

数组相关面试题 26. 删除有序数组中的重复项题目说明示例一示例二提示解析 27.移除元素题目说明示例1示例2提示解析解法一解法二 88. 合并两个有序数组题目示例一示例二示例三提示解析 结语 26. 删除有序数组中的重复项 题目 给你一个 升序排列 的数组 nums &#xff0c;请你…

Verilog HDL——Modelsim仿真

常用testbench语法 $finish 和 $stop &#xff1a; $finish任务用于终止仿真并跳出仿真器&#xff1b;$stop任务则用于中止仿真。timescale [time_unit] / [time_precision] &#xff1a;time_unit指定计时和延时的测量单位&#xff0c;time_precision则是指定仿真器的精度。#…

7.3 有源滤波电路(1)

对信号的频率具有选择性的电路称为滤波电路&#xff0c;它的功能是使特定频率范围内的信号通过&#xff0c;而阻止其它频率信号通过。有源滤波电路是应用广泛的信号处理电路。 一、滤波电路的基础知识 1、滤波电路的种类 通常&#xff0c;按照滤波电路的工作频带为其命名&am…