Qt两种定时器

QT 中使用定时器,有两种方式:

  • 定时器类:QTimer
  • 定时器事件:QEvent::Timer,对应的子类是 QTimerEvent

简单讲一下两种用法:

QTimer:

QTimer 需要创建QTimer对象
  然后需要给定时器绑定 定时器超时的槽函数,也就是时间到了,该做什么
 一般用按钮控制定时器,所以跟按钮关联的槽函数一般里面有start,stop就是控制定时器的
 这样通过按钮点击之后,调用里面Qtimer的start,因为外面绑定了定时器超时槽函数,所以
 定时器到时间了就会调用超时槽函数,完成业务逻辑

QTimerEvent:

 需要重写void QObject::timerEvent(QTimerEvent *event)
 当定时时间到的时候会自动调用timerEvent
 用timerId可以获取哪个定时器的id
 startTimer()可以设置定时器时间间隔 ms
 killTimer停止定时器
对于 QTimerEvent不用重写定时器超时函数并且再手动绑定,QTimerEvent他会自动调用timerEvent,该函数将自动在使用startTimer函数启动的定时器到期时被调用,所以只需要重写这个就行

下面举一个案例:看看实际项目中怎么用

这有一个定时器任务的页面,无ui的,手撕代码去写

.h

#ifndef TIMEREVENT_H
#define TIMEREVENT_H#include <QWidget>
#include <QTimer>
#include <QTimerEvent>
#include <QLabel>class TimerEvent : public QWidget
{Q_OBJECT
public:explicit TimerEvent(QWidget *parent = nullptr);
private slots:void startclick();void pauseclick();void restartclick();//用QTimer,定时器超时的槽函数void timerout1();void timerout2();
private:QLabel* lab1;QLabel* lab2;int id1;int id2;//QTimerQTimer *tm1;QTimer *tm2;
private://QTimerEventvoid timerEvent(QTimerEvent *event);
signals:};#endif // TIMEREVENT_H


.cpp

 

#include "timerevent.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QDebug>//  定时器事件
/** 做定时器有两种方式,一种QTimer类,一种是QEvent的Timer事件 ,用到的子类是QTimerEvent* 用两种都去实现一下* 1.QTimerEvent* 需要重写void QObject::timerEvent(QTimerEvent *event)* 当定时时间到的时候会自动调用timerEvent* 用timerid可以获取哪个定时器的id* startTimer()可以设置定时器时间间隔 ms* killTimer停止定时器** 2.*QTimer 需要创建QTimer对象* 然后需要给定时器绑定 定时器超时的槽函数* 一般在按钮里面有start,stop就是控制定时器的* 这样通过按钮点击之后,调用里面Qtimer的start,因为外面绑定了定时器超时槽函数,所以* 定时器到时间了就会调用超时槽函数* 对于 QTimerEvent不用重写超时函数并且去手动绑定,他会自动调用timerEvent,只需要重写这个就行* */
TimerEvent::TimerEvent(QWidget *parent) : QWidget(parent)
{//垂直布局QVBoxLayout *vblayout = new QVBoxLayout(this);vblayout->setSpacing(0);vblayout->setContentsMargins(0,0,0,0);//QLabel *ql = new QLabel(this);ql->setText("定时器事件");ql->setFixedHeight(50);ql->setAlignment(Qt::AlignCenter);ql->setFrameShape(QFrame::Box);ql->setStyleSheet("color:green;font:25px;background-color:rgb(0,233,233);border-radius:10px;");vblayout->addWidget(ql);//第一个标签lab1 = new QLabel(this);lab1->setFixedSize(95,95);lab1->setFrameShape(QFrame::Box);lab1->setStyleSheet("background-color:yellow");vblayout->addWidget(lab1);//第二个标签lab2 = new QLabel(this);lab2->setFixedSize(95,95);lab2->setFrameShape(QFrame::Box);lab2->setStyleSheet("background-color:purple");vblayout->addWidget(lab2);//三个按钮QPushButton* start= new QPushButton(this);start->setText("开始");QPushButton* pause= new QPushButton(this);pause->setText("暂停");QPushButton* restart= new QPushButton(this);restart->setText("复位");this->setStyleSheet(R"(QPushButton{font-size:20px;})");//水平布局QHBoxLayout *hb = new QHBoxLayout(this);hb->setSpacing(0);hb->setContentsMargins(0,0,0,0);hb->addWidget(start);hb->addWidget(pause);hb->addWidget(restart);vblayout->addLayout(hb);//按键的信号槽connect(start,&QPushButton::clicked,this,&TimerEvent::startclick);connect(pause,&QPushButton::clicked,this,&TimerEvent::pauseclick);connect(restart,&QPushButton::clicked,this,&TimerEvent::restartclick);//Qtimer绑定的信号槽tm1 = new QTimer(this);tm2 = new QTimer(this);connect(tm1,&QTimer::timeout,this,&TimerEvent::timerout1);connect(tm2,&QTimer::timeout,this,&TimerEvent::timerout2);
}void TimerEvent::startclick()
{
#ifdef USR_TIMER_EVENTqDebug()<<"use timerevent";id1=startTimer(10);id2=startTimer(20);
#elseqDebug()<<"use Qtimer";tm1->start(10);tm2->start(20);
#endif
}void TimerEvent::pauseclick()
{
#ifdef USR_TIMER_EVENTqDebug()<<"use timerevent";killTimer(id1);killTimer(id2);
#elseqDebug()<<"use Qtimer";tm1->stop();tm2->stop();
#endif
}void TimerEvent::restartclick()
{lab1->move(0,lab1->y());lab2->move(0,lab2->y());
}
//Qtimer
void TimerEvent::timerout1()
{lab1->move(lab1->x()+5,lab1->y());if(lab1->x()>=this->width()){lab1->move(0,lab1->y());}}void TimerEvent::timerout2()
{lab2->move(lab2->x()+5,lab2->y());if(lab2->x()>=this->width()){lab2->move(0,lab2->y());}
}
//timerevent
void TimerEvent::timerEvent(QTimerEvent *event)
{//当定时器时间到了,看是哪个定时器if(event->timerId()==id1){lab1->move(lab1->x()+5,lab1->y());if(lab1->x()>=this->width()){lab1->move(0,lab1->y());}}if(event->timerId()==id2){lab2->move(lab2->x()+5,lab2->y());if(lab2->x()>=this->width()){lab2->move(0,lab2->y());}}
}

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

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

相关文章

Qt : Style Sheet

When a style sheet is active, the QStyle returned by QWidget::style() is a wrapper “style sheet” style, not the platform-specific style. The wrapper style ensures that any active style sheet is respected and otherwise forwards the drawing operations to t…

消息中间件之RocketMQ(四)

RocketMQ高性能背后的核心原理 1.读队列与写队列 在RocketMQ的管理控制台创建Topic时&#xff0c;可以看到要单独设置读队列和写队列。 通常在运行时&#xff0c;都需要设置读队列写队列。perm字段表示Topic的权限&#xff0c;有三个可选项 2&#xff1a;禁写禁订阅 4: 可订阅…

【前端web入门第二天】01 html语法实现列表与表格

html语法实现列表与表格 文章目录: 1.列表 1.1 无序列表1.2 有序列表1.3 定义列表 2.表格 2.1 表格基本结构2.2 表格结构标签 写在最前,第二天学习目标: 列表 表格 表单 元素为嵌套关系 1.列表 作用:布局内容排列整齐的区域。 列表分类:无序列表、有序列表、定义列表。 1…

pysot中eval多种算法比较和画图

安装miktex和Texwork&#xff0c;记得更新miktex&#xff0c;链接https://miktex.org/download&#xff0c; 参考https://blog.csdn.net/weixin_42495721/article/details/110855071 我用的是pysot官方的库&#xff0c;里面包括eval和test、train等py文件。 路径结构为&#x…

大数据期望最大化(EM)算法:从理论到实战全解析

文章目录 大数据期望最大化&#xff08;EM&#xff09;算法&#xff1a;从理论到实战全解析一、引言概率模型与隐变量极大似然估计&#xff08;MLE&#xff09;Jensen不等式 二、基础数学原理条件概率与联合概率似然函数Kullback-Leibler散度贝叶斯推断 三、EM算法的核心思想期…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Swiper容器组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Swiper容器组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Swiper容器组件 滑块视图容器&#xff0c;提供子组件滑动轮播显示的能力。…

【网站项目】基于SSM的228图书商城网站

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板

文章目录 openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板概述笔记工程中需要的openssl的库实现END openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板 概述 openssl3.2 - 测试程序的学习 整了几个test.c, 每开一个新的测试工程, 总要改这改那的. …

Linux——进程间通信(共享内存)

目录 system V共享内存 ​编辑 共享内存函数 共享内存的建立过程 shmget函数 shmctl函数 shmat函数 shmdt函数 实例代码 共享内存的特点 system V共享内存 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff08;即内存通过某种映射关…

OpenCV-28 全局二值化

一、形态学概念 什么是形态学&#xff1f; 1&#xff09;指一系列处理图像型状特征的图像处理技术 2&#xff09;形态学的基本思想是利用一直特殊的结构元&#xff08;本质上是卷积核&#xff0c;且这个卷积核的值只有1和0&#xff09;来测量或提取输入图像中相应的型状或特…

深入了解Go语言中的HTTP代理处理机制

Go语言&#xff0c;也被称为Golang&#xff0c;自2009年诞生以来&#xff0c;凭借其简洁、高效的特点&#xff0c;逐渐在系统编程、Web开发等多个领域崭露头角。在Web开发中&#xff0c;HTTP代理处理是常见的需求之一。本文将深入探讨Go语言中的HTTP代理处理机制。 HTTP代理是…

【Java 数据结构】LinkedList与链表

LinkedList与链表 1. ArrayList的缺陷2. 链表2.1 链表的概念及结构2.2 链表的实现 3. LinkedList的模拟实现4.LinkedList的使用4.1 什么是LinkedList4.2LinkedList的使用 5. ArrayList和LinkedList的区别 1. ArrayList的缺陷 上节课已经熟悉了ArrayList的使用&#xff0c;并且…

【linux】Linux项目自动化构建工具-make/Makefile

make/makefile 背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的规则来指定&#xff0c;哪些文件需要先编译&#xff0…

Java笔记 --- 二、Stream流

二、Stream流 结合Lambda表达式&#xff0c;简化集合、数组的操作 获取Stream流对象 单列集合获取Stream流 双列集合获取Stream流 数组获取Stream流 一堆零散的数据获取Stream流 Stream流的静态方法of的形参是一个可变参数&#xff0c;可以传递零散数据&#xff0c;也可以传递…

【计算机网络】IP协议及动态路由算法

对应代码包传送门 IP协议及动态路由算法代码包及思科模拟器资料说明 相关文章 【计算机网络】中小型校园网构建与配置 【计算机网络】Socket通信编程与传输协议分析 【计算机网络】网络应用通信基本原理 目的&#xff1a; 1、掌握IP协议&#xff0c;IP分片&#xff0c;DH…

04. OSPF

文章目录 一. 初识OSPF1.1. OSPF概述1.2. OSPF特性1.3. OSPF的专业术语1.4. OSPF维护的3张表1.5. OSPF报文类型1.6. OSPF的邻居状态 二. 实验题2.1. 实验1&#xff1a;点到点链路上的OSPF2.1.1. 实验目的2.1.2. 实验拓扑图2.1.3. 实验步骤&#xff08;1&#xff09;IP地址配置&…

【无标题】Gateway API 实践之(五)FSM Gateway 的会话保持功能

网关的会话保持功能是一种网络技术&#xff0c;旨在确保用户的连续请求在一段时间内被定向到同一台后端服务器。这种功能在需要保持用户状态或进行连续交互的场景中特别重要&#xff0c;例如在维护在线购物车、保持用户登录状态或处理多步骤事务时。 会话保持通过提供一致的用…

java判空工具类 java判断对象属性是否全部为空

java判空工具类 java判断参数是否为空工具类 java判断对象属性是否全部为空 。 可以判断字符串数组&#xff0c;字符串类型&#xff0c;List对象集合&#xff0c;Map集合map<String,object>&#xff0c;map和多个String参数&#xff0c;对象类型&#xff0c;是否为空。…

数据结构C++队列(数组模拟)

队列也是比较简单的数据结构了&#xff0c;队列的特点是先进先出 下面代码中hh是队头&#xff0c;tt是队尾。 默认是从队尾插入数据&#xff0c;队头弹出数据。 代码中的数据结构可以使用这图片来解释&#xff0c;整个区间是数组q。hh和tt分别控制队头和队尾。 例题&#x…

AI作画工具 stable-diffusion-webui 一键安装工具(A1111-Web-UI-Installer)

安装 下载最新版本确保你的 NVIDIA 显卡驱动程序是最新的&#xff08;起码不能太老&#xff09;启动安装程序在欢迎屏幕上单击下一步在屏幕上&#xff0c;选择要安装的内容如果你已经安装了 Python 3.10 和 Git&#xff0c;那么可以取消选中如果你不知道这些是什么&#xff0c…