avatar Nihil

Nichts Hsu

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

Qt 计时器 QTimer 的妙用

发表于 2022/11/21 更新于 2022/11/29
作者 Nichts Hsu
2 分钟阅读
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] () {
    /* 任何你想放在主线程做的事情 */
});
杂记, Qt
qt
本文由作者按照 CC BY 4.0 进行授权
分享

最近更新

  • 『I Wanna』 Best Bye To 2016
  • [译] Rust 中的内联
  • [Rust] 幽灵索引类型与匿名结构体
  • [C++] 深入了解左值与右值
  • Android.bp 中启用 openmp
外部链接
  • 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/30

Rust 2022 年稳定的语法

概览 在整个 2022 年,Rust 一共发布了 1.58.0 ~ 1.66.0 共 9 个版本,让我们感谢 Rust 团队一整年的付出。 通常来说,大部分人都不是喜欢追着 Release Note 啃的类型,因此对于大部分人而言,Rust 的语法就只有书上写出来的那一些。这也是我撰写这篇文章的目的:总结和记录 Rust 整个 2022 年稳定的语法,让更多人意识到 “原来 Rust 还...

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

C++20 Concept

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

本站采用 Jekyll 主题 Chirpy

热门标签

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

发现新版本的内容。