QObject的timerEvent使用
其实在QT里,我们自己写的类一般通常需要继承QObject类,因为这一类里规定好的拿来即可用的方法。
比如信号,槽,以及前一个博文写的movetothread方法,这里就是介绍一个QObject的timerEvent事件。
timerEvent事件可以方便的让对象定时的做某些事情。比如,有一个物联网模块需要每隔几分钟采样一次,
或者检查设备的状态。可以把这些操作放到一个QObject里,定时就可以,然后把QObject扔到另一个线程里,
它就很happy的定时工作了。然后再使用信号和槽,来和主进程进行信息的交流,简直神了。
就可以使用timerEvent进行,很是方便。
吐槽:太喜欢QT的帮助手册了,简直和python 的帮助一样,很是奇怪为什么C,C++没有这样的标准库帮助手册,
难道仅仅就是看头文件?
timerEvent 是QObejct所内置的事件,所有继承自QObject的类都可以使用。
要产生timerEvent,就需要startTimer(delaytime) 方法,startTimer方法返回该对象的这个计时器的id号,int类型。
killTimer(timerid) 停止该对象的id号为timerid的计时器。 对于多个定时器,timerEvent(QTimerEvent *e) 可以通过
e->timerId()来区分哪个timer出发了事件。下面演示一个温度报警的案例,背景是有10个温度传感器,每隔5秒,上位机
读取一次其温度,判断温度的高低,高于45度或低于10度,发出报警信息。如果用普通的方法很麻烦,但是用timerEvent就很容易。
代码(创建一个QTconsole程序):
//温度计的头文件
#ifndef WDJ_H
#define WDJ_H #include <QObject>
#include <QDebug>
class Wdj : public QObject
{
Q_OBJECT
public:
explicit Wdj(QString name,QObject *parent = nullptr);
QString name;
signals: protected:
void timerEvent(QTimerEvent *e);
public slots:
float getTMP();
}; #endif // WDJ_H
//温度计的cpp文件
#include "wdj.h" Wdj::Wdj(QString name,QObject *parent) : QObject(parent),name(name)
{
startTimer(5000); //启动对象的定时器每隔5秒触发一次timerEvent事件
} void Wdj::timerEvent(QTimerEvent *e)
{
//定时器到点,获取温度进行判断
float tmp=getTMP();
if (tmp>45 )
qDebug()<<"Waring Temperature is too high at "<<name ;
if (tmp<10)
qDebug()<<"Waring Temperature is too low at"<<name ;
} float Wdj::getTMP()
{
return 100*rand()/RAND_MAX; //使用随机数创建一个1-100度
} //main.cpp
#include <QCoreApplication>
#include <wdj.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Wdj * w[10];
for (int i=0;i<10;i++)
{
w[i]= new Wdj(QString::number(i+1));
}
return a.exec();
}
运行结果:
Waring Temperature is too high at "1"
Waring Temperature is too high at "10"
Waring Temperature is too high at "9"
Waring Temperature is too high at "8"
Waring Temperature is too high at "7"
Waring Temperature is too low at "6"
Waring Temperature is too high at "4"
Waring Temperature is too high at "3"
Waring Temperature is too low at "1"
Waring Temperature is too high at "9"
Waring Temperature is too high at "5"
.....................................
这样我们就能获取多个温度计的信息。可以看到整个main函数非常的干净,整洁。
这里都在主线程中,可以把他们放到子线程中,主线程就不受影响。
除了打印这些信息还可以通过信号和槽将温度信息传送的主线程中,从而做其他的事情。
QObject的timerEvent使用的更多相关文章
- QTimer源码分析(以Windows下实现为例)
QTimer源码分析(以Windows下实现为例) 分类: Qt2011-04-13 21:32 5026人阅读 评论(0) 收藏 举报 windowstimerqtoptimizationcallb ...
- pyqt5-定时器
定时器的操作方法有两种: 方法一:利用每个对象包含的timerEvent函数 方法二:利用定时器模块 需要 from PyQt5.QtCore import QTimer 方法一:利用每个对象 ...
- 为何只能在其关联的线程内启动timer?(Qt会检查一致性,否则就不执行)
为何只能在其关联的线程内启动timer? 在QTimer源码分析(以Windows下实现为例) 一文中,我们谈到: QTimer的是通过QObject的timerEvent()实现的,开启和关闭定时器 ...
- QEvent
QEvent类是所有事件类的基类,每一个对象都包含事件参数.Qt的主事件循环(QCoreApplication::exec())从事件队列中接收本地窗口系统的事件,并将它们翻译成QEvent,将这些事 ...
- Python 中 PyQt5 库语法(一)
目录 PyQt5库(一) 一. 简介 1. 什么是 Qt 2. 什么是PyQt 3. 环境搭建 二. 基本结构 1. 第一个程序 2. 控件操作 3. 快速生成代码 4. 面向对象 三. 基类控件 1 ...
- Qt中使用定时器(可使用QObject::timerEvent定时执行,QTimer::singleShot可只触发一次)
在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度 1.QObject类的定时器 QObje ...
- QT定时器的两种应用(QObject就有timerEvent事件,一种什么样的居心呢?)
QT中定时器的使用方法(1)重载timerEvent(QTimerEvent *)函数,然后再在类的构造函数中设置时间间隔 startTimer(50);//单位为毫秒(2)在类的构造函数中设定如 ...
- Qt分析:Qt中的两种定时器(可是QObject为什么要提高定时器呢,没必要啊。。。)
Qt有两种定时器,一种是QObject类的定时器,另一种是QTimer类的定时器. (1)QObject类的定时器 QObject类提供了一个基本的定时器,通过函数startTimer()来启 ...
- GUI学习之三——QObject学习总结
鉴于PyQt控件的继承关系,我们先学习PyQt控件的基类——QObject. 一.所有的QT对象的基类 我们先看一下PyQt里空间的继承关系,稍微改一下代码,显示出继承关系 from PyQt5.Q ...
随机推荐
- vue + element ui table表格二次封装 常用功能
因为在做后台管理项目的时候用到了大量的表格, 且功能大多相同,因此封装了一些常用的功能, 方便多次复用. 组件封装代码: <template> <el-table :data=&qu ...
- VUE引入模块之import xxx from 'xxx' 和 import {xxx} from 'xxx'的区别
import FunName from ‘../xxx’ export defualt function FunName() { return fetch({ url: '/article/list' ...
- Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件
一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...
- Day11 - M - Nim or not Nim? HDU - 3032
Nim is a two-player mathematic game of strategy in which players take turns removing objects from di ...
- 3.使用Selenium模拟浏览器抓取淘宝商品美食信息
# 使用selenium+phantomJS模拟浏览器爬取淘宝商品信息 # 思路: # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表 # 第二步:分析商品页数,驱动浏览器翻页,并 ...
- 在linux命令行无界面下,使用selenium进行自动化测试
- Write-up-CH4INRULZ_v1.0.1
关于 下载地址:点我 哔哩哔哩:哔哩哔哩 信息收集 网卡:vboxnet0,192.168.56.1/24,Nmap扫存活主机发现IP为192.168.56.101 ➜ ~ nmap -sn 192. ...
- 当你输入一个url链接发生了什么?
先看一张图 打开手机和pad的QQ 发送消息给QQ好友,此时发送了一个请求给服务器,服务器接受到后反馈给手机和pad发送消息成功,然后QQ好友就可以接受到消息了 电脑浏览器输入百度 打开台式电脑或者笔 ...
- JavaScript内置对象Array、String 的方法
Array push() //将一个或多个数据加入到数组的末端,并返回新的数组长度. pop() //取出数组中的最后一项,修改length属性,并返回被删除的数据 shift() //取出数组中的第 ...
- thymeleaf 在 html和js 中拼接字符串
一.th:text字符串和事件拼接 <span th:text="'Welcome,'+${user.name}"> <span th:text="| ...