qt-C++笔记之Qt中的时间与定时器
qt-C++笔记之Qt中的时间与定时器
code review!
文章目录
- qt-C++笔记之Qt中的时间与定时器
- 一.Qt中的日期时间数据
- 1.1.QTime:获取当前时间
- 1.2.QDate:获取当前日期
- 1.3.QDateTime:获取当前日期和时间
- 1.4.QTime类详解
- 1.5.QDate类详解
- 1.6..QDateTime类详解
- 1.7.日期时间数据与字符串的转换
- 1.8.QThread::sleep()
- 二.QTimer和QElapsedTimer
- 2.1.QTimer示例
- 2.2.QTimer类详解
- 2.3.QTimer::singleShot详解
- 2.4.QTimer::singleShot 可以绑定多个函数吗?
- 2.5.C++中有类似QTimer::singleShot的方法吗?
- 2.6.将非静态成员函数作为槽函数传递给 QTimer::singleShot
- 2.7.QElapsedTimer示例
- 2.7.QElapsedTimer类详解

—— 杭州 2023-11-09 夜
一.Qt中的日期时间数据
1.1.QTime:获取当前时间
运行
Current time: “14:30:45”
1.2.QDate:获取当前日期
运行
Current date: “2023-11-09”
1.3.QDateTime:获取当前日期和时间
运行
Current date and time: “2023-11-09 14:30:45”
1.4.QTime类详解
1.5.QDate类详解
1.6…QDateTime类详解
1.7.日期时间数据与字符串的转换
1.8.QThread::sleep()
二.QTimer和QElapsedTimer
2.1.QTimer示例
QTimer
是 Qt 框架中提供的一个定时器类,用于在特定时间间隔触发信号。它是基于事件循环机制的,可以用于执行定时操作、动画效果、周期性任务等。
以下是关于 QTimer
的一些详解:
1. 创建和设置定时器
您可以使用默认构造函数创建一个 QTimer
对象,并通过 setInterval
方法设置定时器的时间间隔(以毫秒为单位)。例如:
QTimer timer;
timer.setInterval(1000); // 设置定时器间隔为1秒
2. 启动和停止定时器
使用 start
方法可以启动定时器,并开始计时。定时器开始计时后,会在指定的时间间隔内触发 timeout
信号。调用 stop
方法可以停止定时器,停止计时。例如:
timer.start(); // 启动定时器
// ...
timer.stop(); // 停止定时器
3. 信号和槽连接
定时器的主要作用是触发 timeout
信号,您可以通过 QObject::connect
方法将 timeout
信号连接到槽函数,以执行相应的操作。例如:
QObject::connect(&timer, &QTimer::timeout, [](){qDebug() << "Timer timeout";
});
在上述示例中,将定时器的 timeout
信号连接到一个 Lambda 表达式上,每次定时器计时结束时,Lambda 表达式将会执行。
4. 单次触发和重复触发
QTimer
默认情况下是重复触发的,即每隔指定的时间间隔,定时器就会触发一次 timeout
信号。如果您希望定时器只触发一次,可以使用 setSingleShot(true)
方法设置单次触发。例如:
timer.setSingleShot(true); // 设置定时器为单次触发
5. 其他功能
除了上述基本功能外,QTimer
还提供了其他一些功能和方法,例如获取剩余时间、暂停和恢复定时器等。您可以查阅 Qt 官方文档以获取更多详细信息。
注意事项:
QTimer
是基于事件循环机制的,因此需要在应用程序的事件循环中才能正常工作。确保在使用QTimer
时,应用程序的事件循环正常运行。- 如果在多线程环境下使用
QTimer
,请注意线程安全性。
希望这些详解对您有所帮助!如果您还有其他问题,请随时提问。
2.2.QTimer类详解
2.3.QTimer::singleShot详解
2.4.QTimer::singleShot 可以绑定多个函数吗?
2.5.C++中有类似QTimer::singleShot的方法吗?
在 C++ 标准库中,没有直接提供类似 QTimer::singleShot
的功能。不过,您可以使用一些其他方法来实现类似的延时执行的效果。
一种常见的方式是使用 std::this_thread::sleep_for
函数结合 std::thread
来实现延时执行。以下是一个示例:
#include <iostream>
#include <thread>
#include <chrono>void delayedFunction()
{std::cout << "Delayed function executed" << std::endl;
}int main()
{std::chrono::milliseconds delay(2000); // 延时时间为2秒std::thread t([&delay]() {std::this_thread::sleep_for(delay);delayedFunction();});t.join(); // 等待线程执行完毕return 0;
}
在上述示例中,我们使用 std::thread
创建了一个新的线程,在该线程中通过 std::this_thread::sleep_for
函数实现了延时。在延时结束后,执行了 delayedFunction
函数。
请注意,延时时间通过 std::chrono::milliseconds
类型来表示,并传递给 std::this_thread::sleep_for
函数。在示例中,我们设置了延时时间为 2000 毫秒(即 2 秒)。
这种方式可以实现类似的延时执行效果,但请注意在使用多线程时要小心处理线程间的同步和资源访问问题。
除了上述方法,还可以使用第三方库或框架来实现类似的延时执行功能,例如 Boost 库中的 boost::asio::deadline_timer
或者使用 C++11 提供的 <future>
头文件中的 std::async
和 std::future
来实现异步任务的延时执行。
2.6.将非静态成员函数作为槽函数传递给 QTimer::singleShot
在 Qt 中,QTimer::singleShot
函数要求传递一个可调用的函数指针或函数对象作为定时器触发时要调用的槽函数。然而,非静态成员函数需要通过对象实例来调用,而不是直接使用函数指针。
为了解决这个问题,您可以使用以下两种方法之一:
方法一:将非静态成员函数包装为静态成员函数或普通函数
您可以将非静态成员函数包装为静态成员函数或普通函数,然后将该包装函数作为参数传递给 QTimer::singleShot
。在包装函数内部,通过实例化类对象,调用相应的非静态成员函数。示例如下:
#include <QApplication>
#include <QTimer>
#include <QDebug>class MyClass : public QObject
{Q_OBJECT
public slots:void myMemberFunction(){qDebug() << "My member function called";}
};void wrapperFunction()
{MyClass obj;obj.myMemberFunction();
}int main(int argc, char *argv[])
{QApplication app(argc, argv);QTimer::singleShot(2000, &wrapperFunction); // 2秒后执行 wrapperFunctionreturn app.exec();
}
在上述示例中,我们创建了一个 MyClass
类,其中包含一个非静态成员函数 myMemberFunction
。然后,我们创建了一个名为 wrapperFunction
的包装函数,在该函数内部实例化了 MyClass
对象,并调用了 myMemberFunction
。
方法二:使用 Lambda 表达式封装非静态成员函数
您可以使用 Lambda 表达式来封装非静态成员函数,并将 Lambda 表达式作为参数传递给 QTimer::singleShot
。在 Lambda 表达式内部,通过对象实例调用相应的非静态成员函数。示例如下:
#include <QApplication>
#include <QTimer>
#include <QDebug>class MyClass : public QObject
{Q_OBJECT
public slots:void myMemberFunction(){qDebug() << "My member function called";}
};int main(int argc, char *argv[])
{QApplication app(argc, argv);MyClass obj;QTimer::singleShot(2000, [&obj]() { obj.myMemberFunction(); }); // 2秒后执行 Lambda 表达式return app.exec();
}
在上述示例中,我们创建了一个 MyClass
类和一个 MyClass
对象 obj
。然后,我们使用 Lambda 表达式 [&obj]()
来封装非静态成员函数,并在 Lambda 表达式中通过对象实例 obj
调用 myMemberFunction
。
这两种方法都可以解决将非静态成员函数作为槽函数传递给 QTimer::singleShot
的问题。
2.7.QElapsedTimer示例
2.7.QElapsedTimer类详解
QElapsedTimer类是Qt框架中的一个工具类,用于测量时间间隔。它提供了一个高分辨率的计时器,可以用来测量代码执行时间、性能分析等。下面是对QElapsedTimer类的详细解释。
- 包含头文件:
#include <QElapsedTimer>
- 创建一个QElapsedTimer对象:
QElapsedTimer timer;
- 开始计时:
timer.start();
- 获取经过的毫秒数:
qint64 elapsedTime = timer.elapsed();
可以使用elapsed()
函数获取自计时器启动以来经过的毫秒数。如果需要获取其他时间单位,可以使用elapsed()
函数的重载版本,比如elapsedSeconds()
获取经过的秒数。
- 检查计时器是否正在运行:
bool isRunning = timer.isValid();
使用isValid()
函数可以检查计时器是否正在运行。如果计时器已经启动并且没有被重置,isValid()
返回true
;否则返回false
。
- 重置计时器:
timer.restart();
使用restart()
函数可以重置计时器,将计时器的值重置为0,并重新开始计时。
- 静态函数:
QElapsedTimer还提供了一些静态函数:
qint64 QElapsedTimer::nsecsElapsed()
:返回自系统启动以来的纳秒数。qint64 QElapsedTimer::msecsSinceReference()
:返回自系统启动以来的毫秒数。qint64 QElapsedTimer::msecsTo(const QElapsedTimer &other)
:返回从当前计时器到另一个计时器的毫秒数。
相关文章:

qt-C++笔记之Qt中的时间与定时器
qt-C笔记之Qt中的时间与定时器 code review! 文章目录 qt-C笔记之Qt中的时间与定时器一.Qt中的日期时间数据1.1.QTime:获取当前时间1.2.QDate:获取当前日期1.3.QDateTime:获取当前日期和时间1.4.QTime类详解1.5.QDate类详解1.6..QDateTime类…...

【C++】复杂的多继承及其缺陷(菱形继承)
本篇要分享的内容是C中多继承的缺陷:菱形继承。 以下为本篇目录 目录 1.多继承的缺陷与解决方法 2.虚继承的底层原理 3.虚继承底层原理的设计原因 1.多继承的缺陷与解决方法 首先观察下面的图片判断它是否为多继承 这实际上是一个单继承,单继承的特…...
esp32-rust-no_std-examples-blinky
什么是裸机环境? 裸机环境是指没有可供使用的操作系统环境。当编译的 Rust 程序拥有 no_std 属性时,该程序无权访问上述 std 章节中提到的某些特定功能。尽管仍支持使用配网或引入复杂数据结构等功能,但实现方式将会更加复杂。 no_std…...

GitHub上的开源工业软件
github上看到一个中国人做的流体力学开源介绍,太牛了! https://github.com/clatterrr/FluidSimulationTutorialsUnity 先分析一下工业仿真软件赛道 工业仿真软件的赛道和产品主要功能如下: 1. 工艺仿真赛道: - 工厂布局优化&am…...

Centos7安装配置中文输入法
Centos7安装配置中文输入法 在安装CentOS时,我们为了方便使用,语言选择了中文,但是我们发现,在Linux命令行或者是浏览器中输入时,我们只能输入英文,无法输入汉字。 来,跟随脚步,设…...

【OJ比赛日历】快周末了,不来一场比赛吗? #11.11-11.17 #12场
CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 2023-11-11(周六) #5场比赛2023-11-12…...
提取当前文件夹下多文件夹中的数据
提取当前文件夹下多文件夹中的数据 1.实现步骤 现在D:\临时\图库 这个文件夹下有多个文件夹,现在需要将多个文件夹中的文件全部移动到D:\临时\图库下; $sourcePath "D:\临时\图库" $targetPath "D:\临时\图库"Get-ChildItem -Path $sourcePath -File …...

深度学习(生成式模型)——Classifier Free Guidance Diffusion
文章目录 前言推导流程训练流程测试流程 前言 在上一节中,我们总结了Classifier Guidance Diffusion,其有两个弊端,一是需要额外训练一个分类头,引入了额外的训练开销。二是要噪声图像通常难以分类,分类头通常难以学习…...

C语言 每日一题 11.9 day15
数组元素循环右移问题 一个数组A中存有N( > 0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为&…...

STM32F103C8T6第三天:pwm、sg90、超声波、距离感应按键开盖震动开盖蜂鸣器
1. 定时器介绍1(317.21) 软件定时(之前的定时方法)(软件延时)缺点:不精确、占用CPU资源 void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (-…...

栈的顺序存储实现(C语言)(数据结构与算法)
栈的顺序存储实现通常使用数组来完成。实现方法包括定义一个固定大小的数组,以及一个指向栈顶的指针。当元素入栈时,指针加一并将元素存储在相应位置;当元素出栈时,指针减一并返回相应位置的元素。 1. 顺序栈定义 #define MaxSi…...
设计模式 -- 观察者模式
说明 author blog.jellyfishmix.com / JellyfishMIX - githubLICENSE GPL-2.0 定义 观察者模式(Observer Design Pattern) 也被称为发布订阅模式(Publish-Subscribe Design Pattern)。在 GoF 的《设计模式》一书中,它的定义是这样的: Define a one-to-many depe…...

Go RabbitMQ简介 使用
RabbitMQ简介 RabbitMQ 是一个广泛使用的开源消息队列系统,它实现了高级消息队列协议(AMQP)标准,为分布式应用程序提供了强大的消息传递功能。RabbitMQ 是 Erlang 语言编写的,具有高度的可扩展性和可靠性,…...
【面经】Spring框架中用了哪些设计模式
在Spring框架中,主要运用了以下几种设计模式: 工厂模式: Spring beanFactory使用工厂模式在应用程序中管理对象的创建。 通过使用工厂模式,Spring可以将对象的创建与使用分离,降低耦合度。 单例模式: Spr…...

SpringBoot自动配置的原理篇,剖析自动配置原理;实现自定义启动类!附有代码及截图详细讲解
SpringBoot 自动配置 Condition Condition 是在Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操作 思考:SpringBoot是如何知道要创建哪个Bean的?比如SpringBoot是如何知道要创建RedisTemplate的?…...

苹果Ios系统app应用程序开发者如何获取IPA文件签名证书时需要注意什么?
今天呢想和大家介绍介绍苹果App开发者如何获取IPA文件签名证书的步骤和注意事项。对于苹果应用程序开发者而言,获取IPA文件签名证书是发布应用程序至App Store的重要步骤之一。签名证书能够确保应用程序的安全性和可信度,并使其能够在设备上正确运行。 …...

算法通关村第七关-黄金挑战二叉树迭代遍历
大家好我是苏麟 , 今天带来二叉树的迭代遍历 . 二叉树的迭代遍历 前序编列 描述 : 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 题目 : LeetCode 二叉树的前序遍历 : 144. 二叉树的前序遍历 分析 : 前序遍历是中左右,如果还有左子树就一…...

2023-11-Rust
学习方案:Rust程序设计指南 1、变量和可变性 声明变量:let 变量、const 常量 rust 默认变量一旦声明,就不可变(immutable)。当想改变 加 mut(mutable) 。 const 不允许用mut ,只能声明常量,…...

iOS代码混淆----自动
先大致解释一下“编译"、"反编译": 编译:就是把千千万万行字符串(也叫代码,或者源文件),变成010101010101(机器码,也叫目标代码) 编译过程:预处理-编译-汇编-链接 我的脚本运行在预处理阶段。 反编…...

对Mysql和应用微服务做TPS压力测试
1.对Mysql 使用工具:mysqlslap工具 使用命令: mysqlslap -uroot pGG8697000!#--auto generate sql -auto generate sql-load typemixed-concurrency100,200 - number of queries1000-iterations10 - number-int-cols7 - number-charcols13auto genera…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...