8、Qt中定时器的使用

一、说明

在Qt中常使用如下两种定时器

1、使用QObiect类的定时器事件QTimerEvent

与定时器相关的函数有:startTimer()、timeEvent()、killTimer();startTimer(int interval)函数开始一个定时器并返回定时器ID,如果不能开始一个定时器,将返回0。定时器开始后,每隔interval毫秒间隔将触发一次超时事件,超时事件由timerEvent函数处理,在timerEvent函数中通过定时器ID来区分不同的定时器;使用killTimer ( int id )停止定时器,id就是要停止定时器的ID。

2、使用QTimer类

首先创建一个定时器类的对象QTimer *timer = new QTimer(this);

使用timer->setInterval(int msec)提前设置定时器时间或者使用timer->start(std::chrono::milliseconds msec)在定时器开始时设置时间;

在定时器开始msec毫秒后,timer 后会发出timeout()信号,所以在创建好定时器对象后给其建立信号与槽连接connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()));

在超时槽函数onTimeout()里面做超时处理。

在需要开启定时器的地方调用timer->start(1000);

使用timer->stop();停止定时器。

注:void QTimer::singleShot(int msec, const QObject *receiver, const char *member)

这个静态函数进行一次定时器的使用,在msec毫秒后,调用槽函数member,如下示例,程序在6秒后自动终止

QApplication app(argc, argv);

QTimer::singleShot(6000, &app, SLOT(quit()));

...

return app.exec();

二、QTimerEvent使用

创建一个Qt项目,基类选择QMainWindow

在界面上放置如下控件,并修改objectName

修改.h代码如下,声明两个整型变量(m_timer1Id、m_timer2Id)用来存储定时器ID

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();protected:void timerEvent(QTimerEvent* event); //定时器事件private slots:void on_startPushButton1_clicked();void on_stopPushButton1_clicked();void on_startPushButton2_clicked();void on_stopPushButton2_clicked();private:Ui::MainWindow *ui;int m_timer1Id; //定时器1IDint m_timer2Id; //定时器2ID
};#endif // MAINWINDOW_H

修改.cpp代码如下,四个摁键控制两个定时器的开始和停止,timerEvent函数进行定时器超时事件的处理

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QTime>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::timerEvent(QTimerEvent *event)
{//使用定时器ID区分定时器if(event->timerId() == m_timer1Id){qDebug() << "定时器1:" << QTime::currentTime().toString("hh:mm:ss");}else if(event->timerId() == m_timer2Id){qDebug() << "定时器2:" << QTime::currentTime().toString("hh:mm:ss");}
}void MainWindow::on_startPushButton1_clicked()
{m_timer1Id = startTimer(1000*3); //3秒定时器qDebug() <<"定时器1开始" << QTime::currentTime().toString("hh:mm:ss");
}void MainWindow::on_stopPushButton1_clicked()
{killTimer(m_timer1Id);qDebug() <<"定时器1停止" << QTime::currentTime().toString("hh:mm:ss");
}void MainWindow::on_startPushButton2_clicked()
{m_timer2Id = startTimer(1000*5); //5秒定时器qDebug() <<"定时器2开始" << QTime::currentTime().toString("hh:mm:ss");
}void MainWindow::on_stopPushButton2_clicked()
{killTimer(m_timer2Id);qDebug() <<"定时器2停止" << QTime::currentTime().toString("hh:mm:ss");
}

运行程序,点击“开始”“开始”,等一会,点击“停止”“停止”,

输出内容如下,定时器1每隔3秒输出一次,定时器2每隔5秒输出一次,符合程序设定

三、QTimer使用

创建一个Qt项目,基类选择QMainWindow

在界面上放置如下控件,并修改objectName

修改.h代码,声明两个QTimer对象(m_timer1、m_timer2)和两个超时处理槽函数(onTimerOut1、onTimerOut2)

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTimer>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_startPushButton1_clicked();void on_stopPushButton1_clicked();void onTimerOut1();void on_startPushButton2_clicked();void on_stopPushButton2_clicked();void onTimerOut2();private:Ui::MainWindow *ui;QTimer *m_timer1;QTimer *m_timer2;
};#endif // MAINWINDOW_H

 修改.cpp代码,在构造函数中对两个QTimer对象进行初始化,并绑定槽函数,四个摁键控制两个定时器的开始和停止,onTimerOut1和onTimerOut2函数进行定时器超时事件的处理

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);m_timer1 = new QTimer(this);//m_timer1->setInterval(3*1000); //定时3秒connect(m_timer1, &QTimer::timeout, this, &MainWindow::onTimerOut1);m_timer2 = new QTimer(this);//m_timer2->setInterval(5*1000); //定时5秒connect(m_timer2, &QTimer::timeout, this, &MainWindow::onTimerOut2);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_startPushButton1_clicked()
{m_timer1->start(3*1000); //3秒定时器qDebug() <<"定时器1开始" << QTime::currentTime().toString("hh:mm:ss");
}void MainWindow::on_stopPushButton1_clicked()
{m_timer1->stop();qDebug() <<"定时器1停止" << QTime::currentTime().toString("hh:mm:ss");
}void MainWindow::onTimerOut1()
{qDebug() <<"定时器1:" << QTime::currentTime().toString("hh:mm:ss");
}void MainWindow::on_startPushButton2_clicked()
{m_timer2->start(5*1000); //5秒定时器qDebug() <<"定时器2开始" << QTime::currentTime().toString("hh:mm:ss");
}void MainWindow::on_stopPushButton2_clicked()
{m_timer2->stop();qDebug() <<"定时器2停止" << QTime::currentTime().toString("hh:mm:ss");
}void MainWindow::onTimerOut2()
{qDebug() <<"定时器2:" << QTime::currentTime().toString("hh:mm:ss");
}

运行程序,点击“开始”“开始”,等一会,点击“停止”“停止”,

输出内容如下,定时器1每隔3秒输出一次,定时器2每隔5秒输出一次,符合程序设定

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

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

相关文章

家政服务预约小程序系统的开发;

家政服务预约小程序系统的开发&#xff0c;既是对传统加盟服务模式的创新&#xff0c;也是家政商家企业营销推广服务的升级。它推动整个家政服务行业实现线上线下深度融合&#xff0c;提升用户消费体验&#xff0c;实现了雇主、服务提供者、家政企业商家三者之间的无缝衔接&…

go开发之个微机器人的二次开发

简要描述&#xff1a; 下载消息中的语音 请求URL&#xff1a; http://域名地址/getMsgVoice 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型…

【Node.js后端架构:MVC模式】基于expres讲解

Node.js后端架构&#xff1a;MVC模式 什么是MVC MVC (Model-View-Controller) 是一种软件设计模式&#xff0c;用于将应用程序的逻辑分离成三个不同的组件&#xff1a;模型、视图和控制器。 模型&#xff08;Model&#xff09;负责处理应用程序的数据逻辑。它负责从数据库或其…

详解Linux常用命令

目录 1. ps 命令 2. top 命令 3. grep 命令 4. df 命令 5. tail 命令 6. head 命令 7. cat 命令 8. --help 和 man 命令 9. cd 命令 10. mkdir 命令 11. rm 命令 12. mv 和 cp 命令 13. touch 命令 14. vi 或 vim 命令 15. chmod 修改权限 16. 打包和压缩文件 …

Linux 权限管理

1 Linux 安全模型 AAA认证资源分派&#xff1a; 当用户登录时&#xff0c;系统会自动分配令牌 token&#xff0c;包括用户标识和组成员等等信息 1.1 用户 Linux 中每个用户是通过 User ID&#xff08;UID&#xff09;来唯一标识的。 1.2 用户组 Linux 中可以将一个或者多个…

如何通过添加香港高防IP来防御攻击?

​  针对外贸建站&#xff0c;租用香港服务器&#xff0c;除了站长们较为关注的价格外&#xff0c;安全性也是至关重要的。香港服务器在使用中可能会遭受到常见的 DDoS 网络攻击&#xff0c;而在 DDoS 防护这一块&#xff0c;您可以使用香港 DDoS 高防 IP 和香港高防服务器来…

python之logo编程

Logo标志是一种视觉符号&#xff0c;代表着一个品牌、企业或组织的形象。它通常采用图形、字母或字形来代表一个公司或品牌&#xff0c;起到对徽标拥有公司的识别和推广的作用。Logo的设计需要考虑多种因素&#xff0c;例如颜色搭配、字体选择和构图等&#xff0c;以创造出独特…

JDK21无法导入TimeUnit类

运行环境&#xff1a;windows11、IDEA2023.1.3、JDK21 问题描述&#xff1a;IDEA中无法导入java.util.concurrent.TimeUnit类。 以下截图是问题解决后的截图。有问题的时候未截图&#xff0c;说明一下&#xff0c;有问题的时候TimeUnit类是红色的&#xff0c;无法导入&#x…

ChatGPT有什么新奇的使用方式?

2023&#xff0c;ChatGPT几乎席卷了所有行业&#xff0c;并且具有不可测量的巨大潜力等着我们去挖掘。 越来越多人对ChatGPT的应用产生兴趣&#xff0c;知乎上“ChatGPT有什么新奇的使用方式&#xff1f;”这一个热门话题的兴起就是最好的证明。 写作&#xff0c;毫无疑问&…

AutoDL 使用记录

AutoDL 使用记录 1.租用新实例 创建实例需要依次选择&#xff1a;计费方式 → \to → 地区 → \to → GPU型号与数量 → \to → 主机 注意事项&#xff1a; 主机 ID&#xff1a;一个吉利的机号有助于炼丹成功价格&#xff1a;哪个便宜选哪个最高 CUDA 版本&#xff1a;影响…

Android--Jetpack--Lifecycle详解

富贵本无根&#xff0c;尽从勤里得 一&#xff0c;定义 Lifecycle 是一个具备宿主生命周期感知能力的组件。它持有组件&#xff08;Activity/Fragment&#xff09;生命周期状态信息&#xff0c;并且允许其观察者监听宿主生命周期状态变化。 顾名思义&#xff0c;Lifecycle的主…