目录
学习目标
在QT中设置定时任务
例如:
- 每十秒检测一次电池
学习内容
QTimer定时器使用
方法一参考:(31条消息) QT定时任务- timerEvent事件使用以及和QTimer 定时器的使用区别_qt 定时任务_温柔大猩猩的博客-优快云博客
方法一
所有继承自QObject的类,都会有一个timerEvent(QTimerEvent *event)的纯虚函数,我们只需要继承QObject,然后再重载这个函数以实现自己的定时功能。
在.h文件中定义定时器ID
class BatteryCell : public QWidget
{
Q_OBJECT
public:
explicit BatteryCell(QWidget *parent = nullptr);
~BatteryCell();
int timerID;
void Delay_MSec(unsigned int msec);
void init();//初始化函数
private:
QTime chargingTimer;
void timerEvent(QTimerEvent *event);
};
在.cpp文件中重载timerEvent(),使用startTimer(timerId)开启定时器,使用killTimer(timerId)关闭定时器。逻辑里通过验证timeID实现不同功能:
void BatteryCell::init()
{
chargingTimer.start();
timerID=startTimer(10000);//定时任务,每隔10秒检查一次电池是否充电
}
void BatteryCell::timerEvent(QTimerEvent *event)
{
int tmp=event->timerId();
if(tmp == timerID) {
Delay_MSec(5000);
}
}
void BatteryCell::Delay_MSec(unsigned int msec)
{
QTime _Timer = QTime::currentTime().addMSecs(msec); // 在当前的时间上增加多少秒
/*...
检查电池需要执行的操作
...*/
while( QTime::currentTime() < _Timer ) // while循环
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);// 期间在做主事件循环,就避免了阻塞//去掉这句就是阻塞延时了
}
Delay_MSec(INT msec)实现了QT中的非阻塞延时,非常好用,适合在对象内部自延时而不卡住其他事件(如界面事件)。
方法二(实际使用多一些)
在使用中,发现上述的定时做法,存在一点小问题,就是无法让定时事件停止。
在.h文件中设置一个QTimer
QTimer* _Timer;
在.cpp中使用方式:
void BatteryCell::init(){
_Timer= new QTimer();
_Timer->setInterval(10000); //10s
connect(_Timer, SIGNAL(timeout()), this, SLOT(timerFunc()));
_Timer->start();//启动计时器
/*
*其他事件
*/
_Timer->stop();//停止计时器
}
void BatteryCell::timerFunc()
{
/*
*需要定时执行的事件
*/
}
如果需要用来计时,并返回当下已记录的时间,可以使用
在.h文件中添加头文件
#include <QElapsedTimer>
并添加函数
QElapsedTimer* _chargingTimer;
在.cpp文件使用方式:
void BatteryCell::init(){
_chargingTimer= new QElapsedTimer();
_chargingTimer->start();
_chargingTimer->invalidate();//标记无效
if(_chargingTimer->isValid()){//有效
int currentChargingTime=_chargingTimer->elapsed();//记录下的时间长度
}
}
文章介绍了在QT中设置定时任务的两种方法。方法一是利用QObject的timerEvent函数重载,通过startTimer和killTimer控制定时器,适合非阻塞延时。方法二是使用QTimer对象,通过连接timeout信号到槽函数实现定时执行,能方便地启停计时器。另外,文章还提及了QElapsedTimer用于记录时间长度。
298

被折叠的 条评论
为什么被折叠?



