当前位置: 首页 > news >正文

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::asyncstd::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类的详细解释。

  1. 包含头文件:
#include <QElapsedTimer>
  1. 创建一个QElapsedTimer对象:
QElapsedTimer timer;
  1. 开始计时:
timer.start();
  1. 获取经过的毫秒数:
qint64 elapsedTime = timer.elapsed();

可以使用elapsed()函数获取自计时器启动以来经过的毫秒数。如果需要获取其他时间单位,可以使用elapsed()函数的重载版本,比如elapsedSeconds()获取经过的秒数。

  1. 检查计时器是否正在运行:
bool isRunning = timer.isValid();

使用isValid()函数可以检查计时器是否正在运行。如果计时器已经启动并且没有被重置,isValid()返回true;否则返回false

  1. 重置计时器:
timer.restart();

使用restart()函数可以重置计时器,将计时器的值重置为0,并重新开始计时。

  1. 静态函数:
    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&#xff1a;获取当前时间1.2.QDate&#xff1a;获取当前日期1.3.QDateTime&#xff1a;获取当前日期和时间1.4.QTime类详解1.5.QDate类详解1.6..QDateTime类…...

【C++】复杂的多继承及其缺陷(菱形继承)

本篇要分享的内容是C中多继承的缺陷&#xff1a;菱形继承。 以下为本篇目录 目录 1.多继承的缺陷与解决方法 2.虚继承的底层原理 3.虚继承底层原理的设计原因 1.多继承的缺陷与解决方法 首先观察下面的图片判断它是否为多继承 这实际上是一个单继承&#xff0c;单继承的特…...

esp32-rust-no_std-examples-blinky

什么是裸机环境&#xff1f; 裸机环境是指没有可供使用的操作系统环境。当编译的 Rust 程序拥有 no_std 属性时&#xff0c;该程序无权访问上述 std 章节中提到的某些特定功能。尽管仍支持使用配网或引入复杂数据结构等功能&#xff0c;但实现方式将会更加复杂。 no_std…...

GitHub上的开源工业软件

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

Centos7安装配置中文输入法

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

【OJ比赛日历】快周末了,不来一场比赛吗? #11.11-11.17 #12场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-11-11&#xff08;周六&#xff09; #5场比赛2023-11-12…...

提取当前文件夹下多文件夹中的数据

提取当前文件夹下多文件夹中的数据 1.实现步骤 现在D:\临时\图库 这个文件夹下有多个文件夹,现在需要将多个文件夹中的文件全部移动到D:\临时\图库下; $sourcePath "D:\临时\图库" $targetPath "D:\临时\图库"Get-ChildItem -Path $sourcePath -File …...

深度学习(生成式模型)——Classifier Free Guidance Diffusion

文章目录 前言推导流程训练流程测试流程 前言 在上一节中&#xff0c;我们总结了Classifier Guidance Diffusion&#xff0c;其有两个弊端&#xff0c;一是需要额外训练一个分类头&#xff0c;引入了额外的训练开销。二是要噪声图像通常难以分类&#xff0c;分类头通常难以学习…...

C语言 每日一题 11.9 day15

数组元素循环右移问题 一个数组A中存有N&#xff08; > 0&#xff09;个整数&#xff0c;在不允许使用另外数组的前提下&#xff0c;将每个整数循环向右移M&#xff08;≥0&#xff09;个位置&#xff0c;即将A中的数据由&#xff08;A0​A1⋯AN−1&#xff09;变换为&…...

STM32F103C8T6第三天:pwm、sg90、超声波、距离感应按键开盖震动开盖蜂鸣器

1. 定时器介绍1&#xff08;317.21&#xff09; 软件定时&#xff08;之前的定时方法&#xff09;&#xff08;软件延时&#xff09;缺点&#xff1a;不精确、占用CPU资源 void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (-…...

栈的顺序存储实现(C语言)(数据结构与算法)

栈的顺序存储实现通常使用数组来完成。实现方法包括定义一个固定大小的数组&#xff0c;以及一个指向栈顶的指针。当元素入栈时&#xff0c;指针加一并将元素存储在相应位置&#xff1b;当元素出栈时&#xff0c;指针减一并返回相应位置的元素。 1. 顺序栈定义 #define MaxSi…...

设计模式 -- 观察者模式

说明 author blog.jellyfishmix.com / JellyfishMIX - githubLICENSE GPL-2.0 定义 观察者模式(Observer Design Pattern) 也被称为发布订阅模式(Publish-Subscribe Design Pattern)。在 GoF 的《设计模式》一书中&#xff0c;它的定义是这样的: Define a one-to-many depe…...

Go RabbitMQ简介 使用

RabbitMQ简介 RabbitMQ 是一个广泛使用的开源消息队列系统&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;标准&#xff0c;为分布式应用程序提供了强大的消息传递功能。RabbitMQ 是 Erlang 语言编写的&#xff0c;具有高度的可扩展性和可靠性&#xff0c;…...

【面经】Spring框架中用了哪些设计模式

在Spring框架中&#xff0c;主要运用了以下几种设计模式&#xff1a; 工厂模式&#xff1a; Spring beanFactory使用工厂模式在应用程序中管理对象的创建。 通过使用工厂模式&#xff0c;Spring可以将对象的创建与使用分离&#xff0c;降低耦合度。 单例模式&#xff1a; Spr…...

SpringBoot自动配置的原理篇,剖析自动配置原理;实现自定义启动类!附有代码及截图详细讲解

SpringBoot 自动配置 Condition Condition 是在Spring 4.0 增加的条件判断功能&#xff0c;通过这个可以功能可以实现选择性的创建 Bean 操作 思考&#xff1a;SpringBoot是如何知道要创建哪个Bean的&#xff1f;比如SpringBoot是如何知道要创建RedisTemplate的&#xff1f;…...

苹果Ios系统app应用程序开发者如何获取IPA文件签名证书时需要注意什么?

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

算法通关村第七关-黄金挑战二叉树迭代遍历

大家好我是苏麟 , 今天带来二叉树的迭代遍历 . 二叉树的迭代遍历 前序编列 描述 : 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 题目 : LeetCode 二叉树的前序遍历 : 144. 二叉树的前序遍历 分析 : 前序遍历是中左右&#xff0c;如果还有左子树就一…...

2023-11-Rust

学习方案&#xff1a;Rust程序设计指南 1、变量和可变性 声明变量&#xff1a;let 变量、const 常量 rust 默认变量一旦声明&#xff0c;就不可变(immutable)。当想改变 加 mut&#xff08;mutable&#xff09; 。 const 不允许用mut &#xff0c;只能声明常量&#xff0c;…...

iOS代码混淆----自动

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

对Mysql和应用微服务做TPS压力测试

1.对Mysql 使用工具&#xff1a;mysqlslap工具 使用命令&#xff1a; mysqlslap -uroot pGG8697000!#--auto generate sql -auto generate sql-load typemixed-concurrency100,200 - number of queries1000-iterations10 - number-int-cols7 - number-charcols13auto genera…...

为什么我用了六年记账App 最后还是选了一个“不起眼“的网页工具

这篇文章可能会得罪一些人&#xff0c;但我觉得有必要说实话。我用过的记账工具大概有十几个&#xff0c;花了六年在这件事上&#xff0c;花时间、花钱、花精力配置。最后发现&#xff0c;那些大公司做的、宣传做得很大的记账工具&#xff0c;有几个集体性的毛病&#xff0c;而…...

C++面向对象编程:从封装到实战

一、面向过程 VS 面向对象1. 面向过程&#xff08;之前全部所学&#xff09;核心&#xff1a;步骤化、流程驱动先做什么、再做什么&#xff0c;函数独立零散。适合&#xff1a;简单小程序、逻辑简单场景。2. 面向对象&#xff08;C 核心&#xff09;核心&#xff1a;万物皆对象…...

AI智能体入门指南:从零构建能自主规划与执行任务的AI助手

1. 项目概述&#xff1a;AI智能体入门指南最近几年&#xff0c;AI领域最让人兴奋的进展之一&#xff0c;就是“智能体”概念的兴起。你可能已经用过ChatGPT这样的聊天机器人&#xff0c;它们能回答问题、写邮件、生成代码&#xff0c;这已经很厉害了。但智能体更进一步&#xf…...

超越简单备份:TTS-Backup如何重构桌游模拟器的数据完整性保护

超越简单备份&#xff1a;TTS-Backup如何重构桌游模拟器的数据完整性保护 【免费下载链接】tts-backup Backup Tabletop Simulator saves and assets into comprehensive Zip files. 项目地址: https://gitcode.com/gh_mirrors/tt/tts-backup 在数字桌游的世界中&#x…...

告别console.log式调试:VSCode AI智能变量推演与上下文回溯技术(仅限VSCode 1.89+私有API)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;告别console.log式调试&#xff1a;VSCode AI智能变量推演与上下文回溯技术&#xff08;仅限VSCode 1.89私有API&#xff09; VSCode 1.89 引入了基于 Language Server Protocol 扩展的私有调试增强 AP…...

异步电机负载适配控制与效率优化技术研究

异步电机负载适配控制与效率优化技术研究 摘要 异步电动机作为工业驱动领域的核心设备,其能效水平对工业节能具有重要意义。然而,异步电动机在轻载工况下运行效率显著下降,传统固定参数控制策略难以适应负载波动。本文从异步电机损耗构成机制出发,系统分析铜损、铁损、机…...

VSCode嵌入式配置必须关闭的4个默认设置!否则导致Flash烧录失败、SWD通信超时、变量值显示为<optimized out>(附修复前后性能对比数据)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;VSCode嵌入式开发配置的致命陷阱与修复必要性 在嵌入式开发中&#xff0c;VSCode 因其轻量、可扩展和跨平台特性被广泛采用&#xff0c;但默认配置极易埋下隐蔽却破坏性的陷阱——最典型的是调试器路径…...

先进工艺节点下的数字电路库特征化技术与优化策略

1. 数字电路库特征化技术概述在28nm及以下工艺节点的芯片设计中&#xff0c;标准单元库的特征化精度直接影响着时序收敛的成功率。我曾参与过一个7nm移动处理器项目&#xff0c;由于初期库特征化参数偏差0.5ps&#xff0c;导致后端迭代多花费了两个月时间。这个教训让我深刻认识…...

Unity多场景叠加实战:用附加模式加载第二个场景时,如何避免AudioListener和EventSystem的重复警告?

Unity多场景叠加实战&#xff1a;避免AudioListener和EventSystem重复警告的深度解决方案 当你在Unity项目中尝试使用SceneManager.LoadSceneAsync实现多场景叠加时&#xff0c;控制台突然弹出"There are 2 audio listeners in the scene"和"There are 2 event…...

全球牵引链市场深度洞察:4.2%%复合增速支撑

在工业发展与物流运输不断升级的大背景下&#xff0c;牵引链作为关键的基础部件&#xff0c;正迎来前所未有的发展机遇。QYResearch 权威调研显示&#xff0c;2025 年全球牵引链市场规模已达约 3.53 亿美元&#xff0c;这一数字犹如一颗璀璨的信号弹&#xff0c;预示着行业的蓬…...