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):返回从当前计时器到另一个计时器的毫秒数。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/136622.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

17 Linux 中断

一、Linux 中断简介 1. Linux 中断 API 函数 ① 中断号 每个中断都有一个中断号&#xff0c;通过中断号可以区分出不同的中断。在 Linux 内核中使用一个 int 变量表示中断号。 ② request_irq 函数 在 Linux 中想要使用某个中断是需要申请的&#xff0c;request_irq 函数就是…

Docker 学习路线 13:部署容器

部署容器是使用Docker和容器化管理应用程序更高效、易于扩展和确保跨环境一致性性能的关键步骤。本主题将为您概述如何部署Docker容器以创建和运行应用程序。 概述 Docker容器是轻量级、可移植且自我包含的环境&#xff0c;可以运行应用程序及其依赖项。部署容器涉及启动、管…

【Python】数据分析案例:世界杯数据可视化

文章目录 前期数据准备导入数据 分析&#xff1a;世界杯中各队赢得的比赛数分析&#xff1a;先打或后打的比赛获胜次数分析&#xff1a;世界杯中的抛硬币决策分析&#xff1a;2022年T20世界杯的最高得分者分析&#xff1a;世界杯比赛最佳球员奖分析&#xff1a;最适合先击球或追…

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

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

VR全景技术,为养老院宣传推广带来全新变革

现如今&#xff0c;人口老龄化的现象加剧&#xff0c;养老服务行业也如雨后春笋般不断冒头&#xff0c;但是市面上各式的养老院被包装的五花八门&#xff0c;用户实际参访后却差强人意&#xff0c;如何更好的给父母挑选更为舒心的养老环境呢&#xff1f;可以利用720度VR全景技术…

iOS代码混淆----自动

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

什么是数据库?数据库有哪些基本分类和主要特点?

数据库是以某种有组织的方式存储的数据集合。本文从数据库的基本概念出发&#xff0c;详细解读了数据库的主要类别和基本特点&#xff0c;并就大模型时代备受瞩目的数据库类型——向量数据库进行了深度剖析&#xff0c;供大家在了解数据库领域的基本概念时起到一点参考作用。 …

计算机视觉驾驶行为识别应用简述

一、什么是计算机视觉识别&#xff1f; 计算机视觉识别是一种基于图像处理和机器学习的人工智能应用技术&#xff0c;可以用于多个场景。常见应用场景包括人脸识别、场景识别、OCR识别以及商品识别等。今天以咱们国产系统豌豆云为例&#xff0c;为大家梳理一下在车辆驾驶行为中…

Kafka -- 架构、分区、副本

1、Kafka的架构&#xff1a; 1、producer&#xff1a;消息的生产者 2、consumer&#xff1a;消息的消费者 3、broker&#xff1a;kafka集群的服务者&#xff0c;一个broker就是一个节点&#xff0c;主要是负责处理消息的读、写的请求和存储消息。在kafka cluster中包含很多的br…

雷达波形之一——LFM线性调频波形

文章目录 前言一、线性调频信号的形式1、原理2、时域表达式3、频域表达式 二、MATLAB 仿真1、涅菲尔积分①、MATLAB 源码②、仿真结果 2、LFM①、MATLAB 源码②、仿真结果1) 典型 LFM 波形&#xff0c;实部2) 典型 LFM 波形&#xff0c;虚部3) LFM 波形的典型谱 前言 线性调频…

亚马逊云科技海外服务器初体验

目录 前言亚马逊云科技海外服务器概述注册使用流程实例创建性能表现用户体验服务支持初体验总结 前言 随着云原生技术的飞速发展&#xff0c;越来越多的企业和开发者选择云服务器来作为自己的使用工具&#xff0c;云原生技术的发展也促进了云服务厂商的产品发展&#xff0c;所…

Java自学第6课:电商项目(2)

1 创建工具类并连接数据库 在工程src右键单击new&#xff0c;新建util包 再创建DBUtil类 数据库交互需要有数据库支持的包&#xff0c;这是官方给出的类库。 先声明1个代码块 // 静态代码块 只加载1次static{try {Class.forName("com.mysql.jdbc.Driver");} catch (…

华为gre带验证key案例

配置FW_A。 a.配置接口的IP地址&#xff0c;并将接口加入安全区域。 system-view [sysname] sysname FW_A [FW_A] interface GigabitEthernet 1/0/1 [FW_A-GigabitEthernet1/0/1] ip address 1.1.1.1 24 [FW_A-GigabitEthernet1/0/1] quit [FW_A] interface GigabitEthernet 1/…

NAT协议

目录 NAT 前言 NAT地址转换表 NAT分类 前言 静态NAT 192.168.1.2访问200.1.1.2执行过程 动态NAT 192.168.1.2访问200.1.1.2执行过程 NAPT 192.168.1.2的5000端口访问200.1.1.2的80端口执行过程 基本命令 配置动态NAPT转换 定义内外网接口 配置NAPT 静态NAPT配置…

简述SVM

概述 SVM&#xff0c;即支持向量机&#xff08;Support Vector Machine&#xff09;&#xff0c;是一种常见的监督学习算法&#xff0c;用于分类和回归问题。它是一种基于统计学习理论和结构风险最小化原则的机器学习方法。 SVM的主要思想是在特征空间中找到一个最优的超平面…

【Shell脚本8】Shell printf 命令

Shell printf 命令 printf 命令模仿 C 程序库&#xff08;library&#xff09;里的 printf() 程序。 printf 由 POSIX 标准所定义&#xff0c;因此使用 printf 的脚本比使用 echo 移植性好。 printf 使用引用文本或空格分隔的参数&#xff0c;外面可以在 printf 中使用格式化…

Elasticsearch 集群状态详解

cluster state 返回结果详解 GET /_cluster/statehttps://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-state.html详细信息如下&#xff1a; {"cluster_name": "business-log","cluster_uuid": "ArYy-qmCTbCQTDUI8o…

conda清华源安装cuda12.1的pytorch

使用pytorch官方提供的conda command奇慢无比&#xff0c;根本装不下来&#xff08;科学的情况下也这样&#xff09; 配置一下清华源使用清华源装就好了 清华源&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ 配置方法&#xff1a;conda config --…

strtok函数详解:字符串【分割】的利器

目录 一&#xff0c;strtok函数简介 二&#xff0c;strtok函数的用法 三&#xff0c;strtok函数的注意事项 一&#xff0c;strtok函数简介 strtok函数可以帮助我们将一个字符串按照指定的分隔符进行分割&#xff0c;从而得到我们想要的子字符串。 &#x1f342;函数头文件&am…

腾讯待办是不是停了?怎么用其它提醒软件查看导出的ics文件

腾讯待办是腾讯企业旗下的业务产品&#xff0c;其主要以微信小程序的形式使用&#xff0c;定位于待办事项和日程管理工具&#xff0c;支持罗列日程待办清单、设定定时提醒&#xff0c;帮助大家规划日常事务和进行时间管理&#xff0c;成功创建待办事项后可在对应的公众号和绑定…