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秒后执行 wrapperFunction

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IP可视对讲实时录制系统

介绍 软件架构 技术支持 CallRecored介绍 IP可视对讲实时录制系统设计了数据库表&#xff0c;并完成了数据库建模&#xff0c;采用了视频编解码技术&#xff0c;高效网络传输&#xff0c;磁盘高效读写技术&#xff0c;以及提供开放接口。 系统客户端采用扁平化UI&#xff0c;…

如何设计vue项目的权限管理?

权限管理的重要性及必要性 数据安全&#xff1a;权限管理可以确保只有具有相应权限的用户能够访问和操作特定的数据。这可以保护敏感数据不被未授权的用户访问&#xff0c;从而提高数据的安全性。功能控制&#xff1a;权限管理可以根据用户的角色和权限设置&#xff0c;控制用户…

【java:牛客每日三十题总结-3】

java:牛客每日三十题总结 总结如下 总结如下 集合相关知识点 Collection主要的子接口: List:可以存放重复内容 Set:不能存放重复内容,所有重复的内容靠hashCode()和equals()两个方法区分 Queue:队列接口 SortedSet:可以对集合中的数据进行排序 Map没有继承Collection接口&…

vue项目js原生属性IntersectionObserver实现图片懒加载

vue项目js原生属性IntersectionObserver实现图片懒加载 IntersectionObserver 使用js原生属性IntersectionObserver实现观察img元素是否处于游览器视口中 懒加载原理&#xff1a;给img设置一个默认url图片&#xff0c;观察图片处于视口内以后&#xff0c;动态改变img的url为自己…

在Three.js中动画 简单案例

在Three.js中&#xff0c;动画是指在场景中创建和控制对象的运动和变化。模型是指通过Three.js加载的3D对象&#xff0c;可以是几何体、网格或复杂的模型文件&#xff08;如.obj或.gltf&#xff09;。动画可以存在于模型中&#xff0c;也可以单独定义。 编辑关键帧&#xff1a;…

数据结构与算法C语言版学习笔记(5)-串,匹配算法、KMP算法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、串的定义二、串的存储结构1.顺序结构2.链式结构 三、串的朴素的模式匹配算法&#xff08;暴力匹配算法&#xff09;1.背景2.假设我们要从下面的主串 S"…

app自动化测试(Android)--显式等待机制

WebDriverWait类解析 WebDriverWait 用法代码 Python 版本 WebDriverWait(driver,timeout,poll_frequency0.5,ignored_exceptionsNone)参数解析&#xff1a; driver&#xff1a;WebDriver 实例对象 timeout: 最长等待时间&#xff0c;单位秒 poll_frequency: 检测的间隔步…

华为L410上制作内网镜像模板02

原文链接&#xff1a;华为L410上制作离线安装软件模板02 hello&#xff0c;大家好啊&#xff0c;今天给大家带来第二篇在内网搭建Apache服务器&#xff0c;用于安装完内网操作系统后&#xff0c;在第一次开机时候&#xff0c;为系统安装软件的文章&#xff0c;今天给大家介绍在…

nodejs+vue+python+PHP+微信小程序南七街道志愿者服务平台的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

PCIe寄存器之二

关键字索引&#xff1a; CAP_PM 对应&#xff1a;Capabilities: [c0] Power Management CAP_MSI 对应&#xff1a;Capabilities: [c8] MSI CAP_MSIX对应&#xff1a;Capabilities: [e0] MSI-X CAP_EXP 对应&#xff1a;Capabilities: [70] Express (v2) Endpoint 以上 [] 内的…

【云栖2023】张治国:MaxCompute架构升级及开放性解读

简介&#xff1a; 本文根据2023云栖大会演讲实录整理而成&#xff0c;演讲信息如下 演讲人&#xff1a;张治国|阿里云智能计算平台研究员、阿里云MaxCompute负责人 演讲主题&#xff1a;MaxCompute架构升级及开放性解读 活动&#xff1a;2023云栖大会 MaxCompute发展经历了…

网络基础(1)

目录&#xff1a; 1.了解局域网&#xff08;LAN&#xff09;和广域网&#xff08;WAN&#xff09; 2.认识“协议” 3.浅谈OSI七层模型 4.网络传输的基本流程 5.路由器这个设备 ---------------------------------------------------------------------------------------…

手写一个Webpack,带你了解构建流程

如果对前端八股文感兴趣&#xff0c;可以留意公重号&#xff1a;码农补给站&#xff0c;总有你要的干货。 前言 Webpack是一个强大的打包工具&#xff0c;拥有灵活、丰富的插件机制&#xff0c;网上关于如何使用Webpack及Webpack原理分析的技术文档层出不穷。最近自己也是发现…

回归预测 | Matlab实现PCA-PLS主成分降维结合偏最小二乘回归预测

回归预测 | Matlab实现PCA-PLS主成分降维结合偏最小二乘回归预测 目录 回归预测 | Matlab实现PCA-PLS主成分降维结合偏最小二乘回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现PCA-PLS主成分降维结合偏小二乘回归预测&#xff08;完整源码和数据) 1.输…

【19】c++11新特性 —>线程异步

什么是异步&#xff1f; async的两种方式 //方式1 async( Function&& f, Args&&... args ); //方式2 async( std::launch policy, Function&& f, Args&&... args );函数参数&#xff1a; f:任务函数 Args:传递给f的参数 policy:可调用对象f的…

微信的通讯录联系人,有没有什么办法导出来做备份

6-10 这是可以做到的&#xff0c;并且很简单&#xff0c;对于需要把微信通讯录备份出来&#xff0c;或者离职交接的人来说&#xff0c;本文非常适合阅读&#xff0c;只是一个简单的方法&#xff0c;即可快速地把微信的通讯录搞出来&#xff0c;本质其实就是使用正确的工具就行…

C++指针访问数组 函数中用指针传参

用指针访问数组 在函数中用指针传参

2023 年最新腾讯官方 QQ 机器人(QQ 群机器人 / QQ 频道机器人)超详细开发教程

注册 QQ 开放平台账号 QQ 开放平台是腾讯应用综合开放类平台&#xff0c;包含 QQ 机器人、QQ 小程序、QQ 小游戏 等集成化管理&#xff0c;也就是说你注册了QQ 开放平台&#xff0c;你开发 QQ 机器人还是 QQ 小程序都是在这个平台进行部署上线和管理。 如何注册 QQ 开放平台账…

小程序day05

使用npm包 Vant Weapp 类似于前端boostrap和element ui那些的样式框架。 安装过程 注意:这里建议直接去看官网的安装过程。 vant-weapp版本最好也不要指定 在项目目录里面先输入npm init -y 初始化一个包管理配置文件: package.json 使用css变量定制vant主题样式&#xff0…

记误删Linux的python与yum

根据各路大神的方法整理一下自己解决的步骤 注意&#xff1a;不要手贱删python2&#xff01;想用python3就安装并用python3命令 重新安装python2 查看系统版本&#xff1a; cat /etc/redhat-release进入默认的安装地址&#xff1a;注意查看一下rpm文件是不是删干净了&#x…