详解Qt 定时器QTimer

news2024/9/9 1:03:19

文章目录

    • 前言
    • QTimer 是什么
      • 什么时候使用 QTimer
      • 定时器时间到了调用什么函数
    • QTimer 的所有函数
      • 构造函数与析构函数
        • QTimer(QObject *parent = nullptr)
      • 基本操作
        • void start(int msec)
        • void start()
        • void stop()
        • bool isActive() const
      • 定时器属性
        • void setInterval(int msec)
        • int interval() const
        • void setSingleShot(bool singleShot)
        • bool isSingleShot() const
      • 静态函数
        • static void singleShot(int msec, const QObject *receiver, const char *member)
        • static void singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, const char *member)
      • 定时器类型
        • void setTimerType(Qt::TimerType type)
        • Qt::TimerType timerType() const
    • 示例代码:QTimer 每 1 秒生成一次随机数并显示在 LCDNumber 上
      • 头文件
      • 代码详解
  • 总结


前言

QTimer 是 Qt 中用于定时操作的类,可以用来在特定时间间隔触发事件。它在实现周期性任务、延时操作和动画等场景中非常有用。本文将详细介绍 QTimer 的使用方法、函数原型及其作用,并通过一个实例代码展示如何使用 QTimer 每秒生成一次随机数并显示在 LCDNumber 控件中。


QTimer 是什么

QTimer 是 Qt 提供的定时器类,用于在一定时间间隔后触发特定的操作。定时器可以设置为单次触发或周期性触发。在 GUI 应用程序中,QTimer 通常用于定时刷新界面、执行后台任务等。

什么时候使用 QTimer

QTimer 适用于以下场景:

  • 周期性任务:如每隔一段时间刷新界面或获取数据。
  • 延时操作:如延迟执行某个操作。
  • 动画:如在固定时间间隔内更新动画帧。

定时器时间到了调用什么函数

当定时器时间到了,QTimer 会发出 timeout() 信号。可以通过连接这个信号到一个槽函数,来定义定时器超时后需要执行的操作。

void QTimer::timeout();

QTimer 的所有函数

构造函数与析构函数

QTimer(QObject *parent = nullptr)
QTimer(QObject *parent = nullptr);
  • 作用:创建一个新的 QTimer 对象。
  • 参数
    • QObject *parent:定时器的父对象(可选)。
  • 返回值:无。

基本操作

void start(int msec)
void start(int msec);
  • 作用:以指定的时间间隔(毫秒)启动定时器。
  • 参数
    • int msec:时间间隔(毫秒)。
  • 返回值:无。
void start()
void start();
  • 作用:以上一次设置的时间间隔启动定时器。
  • 参数:无。
  • 返回值:无。
void stop()
void stop();
  • 作用:停止定时器。
  • 参数:无。
  • 返回值:无。
bool isActive() const
bool isActive() const;
  • 作用:判断定时器是否正在运行。
  • 参数:无。
  • 返回值:返回布尔值 true 表示定时器正在运行,false 表示未运行。

定时器属性

void setInterval(int msec)
void setInterval(int msec);
  • 作用:设置定时器的时间间隔。
  • 参数
    • int msec:时间间隔(毫秒)。
  • 返回值:无。
int interval() const
int interval() const;
  • 作用:获取定时器的时间间隔。
  • 参数:无。
  • 返回值:返回定时器的时间间隔(毫秒)。
void setSingleShot(bool singleShot)
void setSingleShot(bool singleShot);
  • 作用:设置定时器是否为单次触发。
  • 参数
    • bool singleShot:布尔值,true 表示单次触发,false 表示周期性触发。
  • 返回值:无。
bool isSingleShot() const
bool isSingleShot() const;
  • 作用:判断定时器是否为单次触发。
  • 参数:无。
  • 返回值:返回布尔值 true 表示单次触发,false 表示周期性触发。

静态函数

static void singleShot(int msec, const QObject *receiver, const char *member)
static void singleShot(int msec, const QObject *receiver, const char *member);
  • 作用:创建一个单次触发的定时器。
  • 参数
    • int msec:时间间隔(毫秒)。
    • const QObject *receiver:接收定时器超时信号的对象。
    • const char *member:槽函数的字符串表示,格式为 "slot()"
  • 返回值:无。
static void singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, const char *member)
static void singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, const char *member);
  • 作用:创建一个带定时器类型的单次触发定时器。
  • 参数
    • int msec:时间间隔(毫秒)。
    • Qt::TimerType timerType:定时器类型。
    • const QObject *receiver:接收定时器超时信号的对象。
    • const char *member:槽函数的字符串表示,格式为 "slot()"
  • 返回值:无。

定时器类型

void setTimerType(Qt::TimerType type)
void setTimerType(Qt::TimerType type);
  • 作用:设置定时器类型。
  • 参数
    • Qt::TimerType type:定时器类型。
  • 返回值:无。
Qt::TimerType timerType() const
Qt::TimerType timerType() const;
  • 作用:获取定时器类型。
  • 参数:无。
  • 返回值:返回定时器的类型。

示例代码:QTimer 每 1 秒生成一次随机数并显示在 LCDNumber 上

以下是一个使用 QTimer 每秒生成一个随机数并显示在 LCDNumber 控件上的示例代码:

头文件

#include <QApplication>
#include <QWidget>
#include <QTimer>
#include <QLCDNumber>
#include <QVBoxLayout>
#include <cstdlib>
#include <ctime>

class RandomNumberWidget : public QWidget {
    Q_OBJECT
public:
    RandomNumberWidget(QWidget *parent = nullptr) : QWidget(parent) {
        lcdNumber = new QLCDNumber(this);
        lcdNumber->setDigitCount(5);

        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->addWidget(lcdNumber);
        setLayout(layout);

        timer = new QTimer(this);
        connect(timer, &QTimer::timeout, this, &RandomNumberWidget::updateRandomNumber);
        timer->start(1000);

        std::srand(std::time(nullptr)); // Seed the random number generator
    }

public slots:
    void updateRandomNumber() {
        int randomNumber = std::rand() % 100000; // Generate a random number between 0 and 99999
        lcdNumber->display(randomNumber);
    }

private:
    QLCDNumber *lcdNumber;
    QTimer *timer;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    RandomNumberWidget widget;
    widget.resize(200, 100);
    widget.show();
    return app.exec();
}

#include "main.moc"

在这里插入图片描述
在这里插入图片描述

代码详解

  1. 创建 RandomNumberWidget 类:这是一个继承自 QWidget 的类,用于显示随机数。
  2. 初始化 QLCDNumber:创建 QLCDNumber 对象并设置显示的位数。
  3. 布局管理:使用 QVBoxLayout 将 QLCDNumber 添加到布局中。
  4. 初始化 QTimer:创建 QTimer 对象,并将其 timeout() 信号连接到自定义槽函数 updateRandomNumber()
  5. 启动定时器:设置定时器每隔 1000 毫秒(1 秒)触发一次。
  6. 生成随机数:在槽函数 updateRandomNumber() 中生成一个随机数,并显示在 QLCDNumber 上。
  7. 随机数生成种子:使用 std::srand(std::time(nullptr)) 为随机数生成器设定种子。

总结

QTimer 是 Qt 提供的强大定时器类,适用于各种定时操作场景。通过 QTimer 可以轻松实现周期性任务、延时操作和动画等功能。本文详细介绍了 QTimer 的用法及其常用函数,并通过一个实例代码展示了如何使用 QTimer 每秒生成一次随机数并显示在 LCDNumber 控件上。掌握 QTimer 的使用方法,可以极大提升 Qt 应用程序的功能性和交互性。

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

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

相关文章

瑞芯微平台RK3568系统开发(1)安卓环境搭建

1 开发环境搭建 注意: 重要&#xff01;重要&#xff01;重要&#xff01;自己编译后的固件&#xff0c; 必须先确认io_domains(4.2章节)后&#xff0c;才可以下载到板子运行&#xff0c; 否则可能造成烧坏RK3568的情况。 1.1 更新系统 ~$ sudo apt-get update 1.2 安装依…

MATLAB多元函数梯度下降法找最小值-梯度演示-绘制梯度方向

如果海森矩阵在所有可能的参数值上都是正定的&#xff0c;则该函数是凸的&#xff1b;函数将呈现为光滑的碗状&#xff0c;使得训练过程相对简单。存在单 一的全局最小值&#xff0c;不会有局部最小值或鞍点。 沿着梯度方向&#xff0c;函数变化最快。 x&#xff0c;y点的更新…

LNMP动态网站环境部署

1、LINUX部署 stop firewallddisable selinux 2、Nginx部署 ​ vim /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck1 enabled1 gpgkeyhttps://nginx.org/keys/nginx_signing.…

Java 多线程编程核心技术权威指南(电子版教程)

前言 Java多线程编程是现代软件开发中不可忽视的关键技术&#xff0c;它能有效利用多核处理器的计算能力&#xff0c;实现并发执行&#xff0c;提升系统性能和响应速度。本篇博客将带您深入了解Java线程的核心概念、高级用法以及并发编程中的常见问题与解决方案。无论您是Java…

前端web开发HTML+CSS3+移动web(0基础,超详细)——第1天

一、开发坏境的准备 1&#xff0c;在微软商店下载并安装VS Code 以及谷歌浏览器或者其他浏览器&#xff08;我这里使用的是Microsoft Edge&#xff09; 2&#xff0c;打开vs code &#xff0c;在电脑桌面新建一个文件夹命名为code&#xff0c;将文件夹拖拽到vs code 中的右边…

《python语言程序设计》2018版第6章第19题几何问题点的位置,利用4.31显示如何测试一个点是在一条有向线的左、右还是刚好在线上

# 这个是4.31的代码&#xff0c;一个函数里包含了。在线上&#xff0c;在线左&#xff0c;在线右 def judgePoint(x0, y0, x1, y1, x2, y2):juMethod ((x1 - x0) * (y2 - y0)) - ((x2 - x0) * (y1 - y0))if juMethod > 0:print("p2 is on the left side of the line f…

MATLAB 共轭梯度法求解线性方程组(附代码)

共轭梯度法求解线性方程组 1. 引言 共轭梯度法&#xff08;Conjugate Gradient Method&#xff09;是一种用于求解大型稀疏对称正定线性方程组的迭代算法。该方法结合了梯度下降法和共轭方向的概念&#xff0c;以达到更快速的收敛。共轭梯度法 是介于最速下降法与牛顿法之间的…

Android 11(R) IPC Binder机制 初版

Android 系统分为三层。最上层是application应用层&#xff0c;第二层是framework层&#xff0c;第三层是native层 1.Android 中的应用层和系统服务层不在同一个进程&#xff0c;系统服务在单独的进程中。每个应用的进程都是zygote fork出来的。 2.Android中不同应用属于不同…

数据驱动未来:构建下一代湖仓一体电商数据分析平台,引领实时商业智能革命

1.1 项目背景 本项目是一个创新的湖仓一体实时电商数据分析平台&#xff0c;旨在为电商平台提供深度的数据洞察和业务分析。技术层面&#xff0c;项目涵盖了从基础架构搭建到大数据技术组件的集成&#xff0c;采用了湖仓一体的设计理念&#xff0c;实现了数据仓库与数据湖的有…

《程序猿入职必会(4) · Vue 完成 CURD 案例 》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

【优选算法】——leetcode——438.找到字符串中所有字母异位词

目录 1.题目 2.题目理解 3.算法原理 1.如何快速判断两个字符串是否是异位词 2.解决问题 暴力求解——>滑动窗口哈希表 滑动窗口 利用滑动窗口哈希表解决问题 优化&#xff1a;更新结果的判断条件 4.编程代码 C代码 1.频率统计 2. 双指针 C语言代码 1.字符频率…

传统CS网络的新生——基于2G网络的远程灌溉实现

概述&#xff1a;iphone 实现远程电话触发&#xff0c;实现灌溉绿植的一般方法 方法一&#xff1a; 远程电话触发&#xff0c;音频线左右声道会产生一个信号&#xff0c;可以在后端利用SR锁存器暂存信号&#xff0c;后级可以接相应的控制电路实现灌溉。 方法二&#xff1a; 同…

记录阮一峰grid教程笔记

前言 看了阮一峰的grid教程&#xff0c;做一个笔记&#xff0c;主要自己看&#xff0c;有理解错误的地方后续更正&#xff0c;有新的理解后续补充。教程链接如下&#xff1a; CSS Grid 网格布局教程 - 阮一峰的网络日志 grid主要分为容器属性和项目的属性&#xff0c;在行列布…

React 学习——Context机制层级组件通信

核心思路&#xff1a;&#xff08;适用于所有层级&#xff0c;不仅仅是爷孙 父子&#xff09; createContext方法创建一个上下文对象在顶层组件 通过Provider组件提供数据在底层组件&#xff0c;通过useContext钩子函数使用数据 import { createContext, useContext } from …

NSSRound#4 Team

[NSSRound#4 SWPU]1zweb 考察&#xff1a;phar的反序列化 1.打开环境&#xff0c;审计代码 1.非预期解 直接用file伪协议读取flag,或直接读取flag file:///flag /flag 2.正常解法 用读取文件读取index.php,upload.php的源码 index.php: <?php class LoveNss{publi…

Java面试八股之Spring DAO的作用

Spring DAO的作用 Spring DAO (Data Access Object) 是 Spring 框架的一个重要组成部分&#xff0c;它提供了一套用于简化数据访问操作的抽象层。Spring DAO 的核心目的是使开发人员能够更容易地处理数据访问相关的异常&#xff0c;并提供一致的异常处理机制&#xff0c;同时简…

翻译: 可视化深度学习神经网络一

这是一个随意书写的28*28像素、分辨率很低的数字 3 但你的大脑一看见就能轻松辨识出来 &#xff0c;我想要你好好欣赏这点 人脑能够毫无障碍地辨识是非常厉害的 我的意思是&#xff0c;这个、这个、还有这个&#xff0c;都能被识别为 3 即使前后图像的图形组成有很大差异 当你…

什么情况?我代码没了

前两天检视代码时&#xff0c;发现PR里面有两个提交的描述信息一模一样&#xff0c;于是我提出应该将这两个提交合并成一个&#xff0c;保持提交树的清晰。 1 先储存起来&#xff01; 而同事这时正在开发别的特性&#xff0c;工作区不是干净的&#xff0c;没法直接执行 git r…

c程序杂谈系列(职责链模式与if_else)

从处理器的角度来说&#xff0c;条件分支会导致指令流水线的中断&#xff0c;所以控制语句需要严格保存状态&#xff0c;因为处理器是很难直接进行逻辑判断的&#xff0c;有可能它会执行一段时间&#xff0c;发现出错后再返回&#xff0c;也有可能通过延时等手段完成控制流的正…

python生成二维码指向说明书

python生成二维码转向文档 python生成二维码指向说明书 import qrcode# 生成包含本地文档路径的二维码 def generate_qrcode(local_file_path):qr qrcode.QRCode(version1,error_correctionqrcode.constants.ERROR_CORRECT_L,box_size10,border4,)qr.add_data(local_file_pa…