Qt定时器的两种实现方式

小王子🤴 2020-11-24 23:06:59 7933
Qt定时器的两种实现方式

Qt中定时器使用有两种,一种是QObject的定时器,一种是QTimer的定时器

QObject:

QObject中的定时器的使用,需要用到三个函数
1、 int QObject::startTimer ( int interval ) ;
这个是开启一个定时器的函数,他的参数interval是毫秒级别。当开启成功后会返回这个定时器的ID, 并且每隔interval 时间后会进入timerEvent 函数。直到定时器被杀死。
2、 void QObject::timerEvent ( QTimerEvent * event );
当定时器超时后,会进入该事件timerEvent函数,需要重写timerEvent函数,在函数中通过判断event->timerId()来确定定时器,然后执行某个定时器的超时函数。
3、 void QObject::killTimer ( int id );
通过从startTimer返回的ID传入killTimer 函数中杀死定时器,结束定时器进入超时处理。
代码实现:

#ifndef TESTTIMER_H
#define TESTTIMER_H

#include <QObject>

class TestTimer : public QObject
{
    Q_OBJECT
public:
    explicit TestTimer(QObject *parent = nullptr);
    void startT();
    void killT(int id);
protected:
    virtual void timerEvent( QTimerEvent *event);  
signals:

};

#endif // TESTTIMER_H

#include "testtimer.h"
#include <QtDebug>
#include <QTimerEvent>

TestTimer::TestTimer(QObject *parent) : QObject(parent)
{

}

void TestTimer::startT()
{
    qDebug() << "start timeID:" << startTimer(100);
}

void TestTimer::killT(int id)
{
    killTimer(id);
}

void TestTimer::timerEvent(QTimerEvent *event)
{
    qDebug() << QString::fromLocal8Bit("定时器ID:") << event->timerId();
}
QTimer

1、 首先创建一个定时器类的对象
QTimer *timer = new QTimer(this);
2、 timer 超时后会发出timeout()信号,所以在创建好定时器对象后给其建立信号与槽
connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
3、 在需要开启定时器的地方调用void QTimer::start ( int msec );
这个start函数参数也是毫秒级别;
timer->start(msec );
4、 在自己的超时槽函数里面做超时处理。

#ifndef TESTTIMER_H
#define TESTTIMER_H
#include <QObject>
#include <QTimer>

class TestTimer : public QObject
{
    Q_OBJECT
public:
    explicit TestTimer(QObject *parent = nullptr);
    void startT();
    void killT(int id);
protected:
public slots:
    void Timeout();
private:
    QTimer *time= nullptr;
};

#endif // TESTTIMER_H

#include "testtimer.h"
#include <QtDebug>
#include <QTimerEvent>

TestTimer::TestTimer(QObject *parent) : QObject(parent)
{
    time= new QTimer();
    connect(time, SIGNAL(timeout()), this, SLOT(Timeout()));  

}

void TestTimer::startT()
{
    time->start(100);
}

void TestTimer::killT(int id)
{
    time->stop();
}

void TestTimer::Timeout()
{
    qDebug()<< "Timeout";
}

如果你只需要调用一次定时器就没必要再去写超时函数,QTimer有一个只调用一次的超时接口:
QTimer::singleShot(100,this,[=](){
//方法实现
});
QTimer::singleShot的第三个参数就是超时出发函数,是个槽函数,为了方便使用和阅读,这个地方我使用的是lambda表达式

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 95 55 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
小王子🤴
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区