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…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
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 …...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...
