avatar

Nihil

Nichts Hsu

  • 首页
  • 子域
  • 分类
  • 标签
  • 归档
  • 关于
首页 Qt 计时器 QTimer 的妙用
文章

Qt 计时器 QTimer 的妙用

发表于 2022/11/21 更新于 2022/11/29
作者 Nichts Hsu
2 分钟阅读

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] () {
    /* 任何你想放在主线程做的事情 */
});
杂记, Qt
qt
本文由作者按照 CC BY 4.0 进行授权
分享

最近更新

  • 从另一个视角看 Rust HRTBs
  • C++ Coroutine VS Rust Async
  • Rust 不透明类型上的生命周期
  • USB 2.0 与 USB 3.2
  • Rust 中的闭包递归与 Y 组合子
外部链接
  • 996.icu
  •  此博客的 Github 仓库
  •  Olimi 的个人博客

文章内容

相关文章

2023/01/13

记录在 Qt 重写事件时犯的蠢

前段时间,我想要通过提供选项框的形式来允许用户自定义界面 UI 的字体和大小,就像这样: 然后生成形如 * { ... } 的 QSS 字符串,通过 qApp->setStyleSheet(qss) 应用给所有窗口组件。 然而奇怪的事情出现了,我在主界面有两个 QTextBrowser 组件,一个是通过 new QTextBrowser 出来然后 addWidget 到布局上的...

2022/11/01

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

前言 目前,大部分的 AppImage 的教程与工具都建议你在最低所支持的系统上进行编译打包,这是由于 Linux 系统的兼容性,在旧版本系统打包的软件可以正常在新版本系统中运行,反过来则不行。 但是这一点对于 Qt 用户尤其是 Qt6 用户而言很不友好:一方面,在旧版本的 Linux 系统上很难安装高版本的 Qt,另一方面,过于老旧的 GCC 不支持大量的 C++ 新特性,需要对代码进...

2022/12/16

C++ Concept 重载决议探讨

测试环境 OS: Ubuntu 22.04 CC: GCC 11.2.0 重载决议 重载决议(Overload Resolution)的定义,摘自 cppreference: 为了编译函数调用,编译器必须首先进行名字查找,对于函数可能涉及实参依赖查找,而对于函数模板可能后随模板实参推导。如果这些步骤产生了多个候选函数,那么需要进行重载决议选择将要实际调用的函数。 ...

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

C++20 Concept

© 2025 Nichts Hsu. 保留部分权利。

本站采用 Jekyll 主题 Chirpy

热门标签

编程语言 教程 rust c++ android c++20 usb 翻译 linux qt

发现新版本的内容。