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_OBJECT

public:
    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; //定时器1ID
    int 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_OBJECT

public:
    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秒输出一次,符合程序设定

相关推荐
湫ccc25 分钟前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe1 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin1 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
Ysjt | 深2 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
ephemerals__2 小时前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
码农飞飞2 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货2 小时前
Rust 的简介
开发语言·后端·rust
湫ccc2 小时前
《Python基础》之基本数据类型
开发语言·python