首页 Qt 计时器 QTimer 的妙用
文章
取消

Qt 计时器 QTimer 的妙用

QTimer 基础用法

QTimer 提供了计时器的高级编程接口,我们可以通过 Qt 的信号槽机制快速启用一个定时器:

1
2
3
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, recv, &recv::slot_function);
timer->start(1000);

这将会使 recv 实例的 slot_function 函数每一秒都被调用一次。

可以通过 timer->setSingleShot(false) 来使 QTimer 只计时一次,但是通常没有这个必要,我们可以直接使用 QTimer 的静态函数:

1
QTimer::singleShot(1000, recv, &recv::slot_function);

0 计时器

通常来说,计时为 0 的计时器几乎就等于直接执行代码。但是在 Qt 中,0 计时器仍然有它的妙用。

简单描述一下我遇到的问题,我引入了一个第三方 C 库,该库中启用了一个线程用以监听某些事件,由于是 C 库,我必须使用静态函数来注册事件回调函数,并且在该回调函数中调用了一个全局静态实例的函数将回调数据进行 C++ 层次的封装。然而我在该全局静态实例的 C++ 封装函数中创建了 UI 控件,这会导致 Qt 程序崩溃并且告诉我们只允许在主线程中创建 UI 控件。

通常这种情况,我们需要考虑信号槽机制,因为 Qt::QueuedConnection 模式会帮助我们更轻松地处理跨线程问题。很巧合的是,我们有一个简单又快速的方案来构建一套信号槽,那就是 0 计时器:

1
2
3
QTimer::singleShot(0, this, [this] () {
    /* 任何你想放在主线程做的事情 */
});
本文由作者按照 CC BY 4.0 进行授权

在高版本系统上为 Qt6 生成 AppImage

C++20 Concept