zoukankan      html  css  js  c++  java
  • 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函数非常的干净,整洁。

    这里都在主线程中,可以把他们放到子线程中,主线程就不受影响。

    除了打印这些信息还可以通过信号和槽将温度信息传送的主线程中,从而做其他的事情。

  • 相关阅读:
    MVVM架构~knockoutjs系列之表单添加(验证)与列表操作源码开放
    MVVM架构~knockoutjs系列之验证成功提示显示
    MVVM架构~knockoutjs系列之正则表达式使规则更灵活
    郁闷~win7无法进行局域网访问解决
    不合规范的html段落php处理细则
    备份一个通过拷贝来创建虚拟机镜像的脚本
    [置顶] ffmpg简介以及用它实现音频视频合并(java)
    [Java] HttpClient有个古怪的stalecheck选项
    POJ 1260 Pearls
    “AIR SDK 0.0: AIR SDK location “...devsdksAIRSDKWin” does not exist.”问题解决~
  • 原文地址:https://www.cnblogs.com/yjphhw/p/11070614.html
Copyright © 2011-2022 走看看