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

QT使用事件事件和绘制事件实现简易时钟

        这个时钟实现的底层原理主要是利用 Qt 的绘图机制和定时器。首先,设置固定大小的窗口,创建定时器并连接到槽函数,定时器每秒钟触发一次,触发窗口重绘。在paintEvent函数中,使用QPainter进行绘图,绘制圆形表盘和时间点标记。通过获取当前时间,计算时针、分针和秒针的旋转角度,使用rotate函数旋转坐标系,然后绘制相应长度的直线代表指针。每次定时器触发时,调用update函数引发重绘,实现时钟的动态显示。

widght.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QDebug>
#include <QLabel>
#include <QPen>
#include <QPainter>
#include <QPaintEvent>
#include <QTime>
#include <QTimer>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;//定时器QTimer *timer;//绘制事件void paintEvent(QPaintEvent *event) override;private slots:;void update_slot();
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"#include <QTime>
#include <QPainter>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置窗口大小this->setFixedSize(600, 600);// 创建定时器timer = new QTimer(this);// 连接定时器时信号与槽函数connect(timer, &QTimer::timeout, this, &Widget::update_slot);timer->start(1000);QLabel *name = new QLabel(this);name->setText("江诗丹顿");name->move(this->width()/2-30,this->height()/2+100);name->setStyleSheet("color: red; font-size: 16px;");}Widget::~Widget()
{delete ui;
}void Widget::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);// 获取当前时间QTime time = QTime::currentTime();// 准备画笔QPen pen;pen.setColor("green");pen.setWidth(2);// 实例化一个画家QPainter painter(this);painter.setPen(pen);painter.drawEllipse(this->width()/2 - 200, this->height()/2 - 200, 400, 400);// 设置坐标系起点为窗口中心painter.translate(this->width()/2, this->height()/2);// 绘制时间点标记pen.setColor("gray");pen.setWidth(2);painter.setPen(pen);for (int i = 0; i < 12; ++i) {painter.save();painter.rotate(30 * i);painter.drawLine(180, 0, 190, 0);painter.restore();}// 绘制时针painter.rotate(30.0 * ((time.hour() % 12) + time.minute() / 60.0 + time.second() / 3600.0));pen.setWidth(8);pen.setColor("blue");painter.setPen(pen);painter.drawLine(0, 0, 50, 0);// 绘制分针painter.rotate(6.0 * (time.minute() + time.second() / 60.0));pen.setWidth(4);pen.setColor("orange");painter.setPen(pen);painter.drawLine(0, 0, 70, 0);// 绘制秒针painter.rotate(6.0 * time.second());pen.setWidth(2);pen.setColor("red");painter.setPen(pen);painter.drawLine(0, 0, 90, 0);}void Widget::update_slot()
{update();
}

http://www.lryc.cn/news/435766.html

相关文章:

  • kubeadm方式安装k8s
  • 如何使用go生成可执行文件
  • 手写Promise
  • 深度学习云服务器免费使用教程
  • 使用ansible的剧本制作salt-master与salt-minion的安装与启动服务过程
  • 数据库sqlite3
  • 开发基础之Python 函数(Basic Python Functions for Development)
  • Django_Vue3_ElementUI_Release_001_项目初始化
  • MySQL之安装与基础知识
  • 前端基础 | HTML基础:HTML结构,HTML常见标签
  • 宏任务和微任务+超全面试真题
  • 针对SVM算法初步研究
  • Java中的`String`不可变性详解
  • c# SMTP发送邮件
  • GPU基础 -- 并行化与阿姆达尔定律
  • Lua热更
  • 提升汽车行业软件质量:ASPICE培训的关键实践方法
  • 2024 全新智能识别 API 接口震撼登场
  • 《UniVS: Unified and Universal Video Segmentation with Prompts as Queries》要点提炼
  • 计算机毕业设计选题推荐-推拿知识互动平台-Java/Python项目实战
  • 基于SpringBoot+Vue+MySQL的瑜伽馆管理系统
  • 【MySQL】EXPLAIN(执行计划)关键字是什么?
  • Mybatis两种方式来调用sql语句
  • 第十八节:学习统一异常处理(自学Spring boot 3.x的第五天)
  • flink中slotSharingGroup() 的详解
  • ASPF 技术介绍
  • 77-java 装饰器模式和适配器模式区别
  • 5. Fabric 设置画布大小
  • 240912-通过Ollama实现网站知识总结
  • Debian 包管理工具apt使用