Qt的定时器(笔记)

59 篇文章 1 订阅

QObject 是所有 Qt 对象的基类,在 Qt 中提供了基本的定时器支持。使用 QObject::startTimer(),您可以启动一个以毫秒为单位的定时器作为参数。该函数返回一个唯一的整数定时器 ID。定时器现在将定期触发,直到您使用定时器 ID 显式调用 QObject::killTimer()。

要使这种机制起作用,应用程序必须在事件循环中运行。你用 QApplication::exec() 开始一个事件循环。当定时器触发时,应用程序发送一个 QTimerEvent,并且控制流离开事件循环,直到定时器事件被处理。这意味着当您的应用程序忙于做其他事情时,定时器无法触发。

在多线程应用程序中,您可以在任何具有事件循环的线程中使用定时器机制。要从非 GUI 线程启动事件循环,请使用 QThread::exec()。 Qt 使用对象的thread affinity来确定哪个线程将传递 QTimerEvent。无法为另一个线程中的对象启动定时器。

定时器功能的主要 API 是 QTimer。该类提供了在定时器触发时发出信号的常规定时器,并继承了 QObject 以便它很好地适应大多数 Qt 程序的所有权结构。正常的使用方式是这样的:

QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &Foo::updateCaption);
    timer->start(1000);

QTimer 对象成为该对象的子对象,因此,当该对象被删除时,定时器也被删除。接下来,它的 timeout() 信号连接到将完成工作的插槽,它以 1000 毫秒的值启动,表示它将每秒超时。

QTimer 还为单次定时器提供了一个静态函数。例如:

QTimer::singleShot(200, this, &Foo::updateCaption);

在这行代码执行 200 毫秒后,将调用 updateCaption() 槽。

要使 QTimer 工作,您的应用程序中必须有一个事件循环;也就是说,您必须在某处调用 QCoreApplication::exec() 。只有在事件循环运行时才会传递定时器事件。

模拟时钟示例展示了如何使用 QTimer 定期重绘QWidget。

AnalogClock::AnalogClock(QWidget *parent)
    : QWidget(parent)
{
    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update));
    timer->start(1000);
    ...
}

每一秒,QTimer 都会调用 QWidget::update() 槽来刷新时钟的显示。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天进步2015

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值