其實在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函數非常的干凈,整潔。
這里都在主線程中,可以把他們放到子線程中,主線程就不受影響。
除了打印這些信息還可以通過信號和槽將溫度信息傳送的主線程中,從而做其他的事情。
