Qt多种定时器

194 篇文章 107 订阅

介绍Qt的三种定时器QObject内部定时器,QBasicTimer,QTimer。

QObject内部定时器

  使用startTimer开启定时器,使用killTimer(int id)接口来关闭指定的定时器。
  启动定时器后会在对应间隔时间触发timerEvent事件。
  示例

class Object : public QObject {
    Q_OBJECT
public:
    Object()
    {
        startTimer(1000);
    }
    
protected:
    void timerEvent(QTimerEvent *event) { }
};

QBasicTimer

  QBasicTimer类为对象提供定时器事件。
  QBasicTimer特点快速轻量级低级类。对于需要降低使用多个定时器开销的应用程序,QBasicTimer可能是一个不错的选择。如果是一般使用情况建议使用更高级别的QTimer类而不是此类。
  使用start接口来设置定时时间与定时事件的接收对象。
  示例

class Object : public QObject {
    Q_OBJECT
public:
    Object() { }

protected:
    void timerEvent(QTimerEvent *event) { }
}
Object object;
QBasicTimer basicTimer;
basicTimer.start(500, &object);

QTimer

  QTimer类提供重复单次定时器。
  QTimer类为定时器提供高级编程接口。创建一个QTimer实例,将其timeout()信号连接到对应的槽中,然后调用start()开启定时器,每隔一段时间会发出timeout()信号。
  示例

class Object : public QObject {
    Q_OBJECT
public:
    Object()
    {
        connect(&m_timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
        m_timer.start(1000);
    }

private slots:
    void onTimeout() { }

private:
    QTimer m_timer;
};

定时器小知识

  • 需要不同时间精度的定时器,可以指定定时器的TimerType类型。
Qt::TimerType解释
Qt::PreciseTimer精确的定时器试图保持毫秒精度
Qt::CoarseTimer粗略的定时器试图将精度保持在所需间隔的5%以内
Qt::VeryCoarseTimer非常粗略的定时器

  特别地Qt::VeryCoarseTimer非常粗略的意思是精度为±500ms。例如,10500ms的间隔将四舍五入为11000ms,而10400ms会置为10000ms。

  • 上述定时器例子都为循环触发,需要停止定时器请使用stopkillTimer,而想使用单次定时器最好使用QTimer::singleShot接口。
  • 使用QObject::timerEvent捕获定时器事件,如果存在多个定时器源,可以使用timerId来判断确定那个定时器事件。
  • 如果系统忙或无法提供请求的准确性,所有定时器类型都有可能会比预期的时间晚超时。在这种晚超时的情况下,虽然是多个超时已经过期,但是只发出一次超时事件。
  • QTimer的remainingTime接口可以获得距离触发定时器事件的剩余时间
  • 使用QObject的startTimer需要注意的是每调用一次会新增一个定时器并返回一个定时器ID。
id1 = startTimer(1000); // 开启一个1秒定时器,返回其定时器ID
id2 = startTimer(2000); // 开启一个2秒定时器,返回其定时器ID
id3 = startTimer(3000); // 开启一个3秒定时器,返回其定时器ID
  • Qt官方使用定时器的例子可以参考Analog Clock Example
    在这里插入图片描述

  • 本文首发于公众号:Qt君
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值