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

相关推荐

  1. Qt定时器QTimer

    2023-12-05 15:30:11       22 阅读
  2. 组件使用定时器及销毁问题(vue问题)

    2023-12-05 15:30:11       37 阅读
  3. Qt定时器

    2023-12-05 15:30:11       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-05 15:30:11       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-05 15:30:11       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-05 15:30:11       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-05 15:30:11       18 阅读

热门阅读

  1. vue3 element-plus el-table表头冻结,表头吸顶

    2023-12-05 15:30:11       40 阅读
  2. 聊聊logback的ThrowableProxyConverter

    2023-12-05 15:30:11       38 阅读
  3. 2022大厂高频面试题之HTML篇

    2023-12-05 15:30:11       43 阅读
  4. Spring-Mybatis读写分离笔记整理

    2023-12-05 15:30:11       26 阅读
  5. PTA 7-238 整数转换为字符串

    2023-12-05 15:30:11       37 阅读
  6. 2023-简单点-tkinter中的ttk和tk

    2023-12-05 15:30:11       41 阅读
  7. RabbitMQ避免重复消费

    2023-12-05 15:30:11       57 阅读
  8. 简谈PostgreSQL的wal_level=logic

    2023-12-05 15:30:11       31 阅读
  9. FlinkSql-Temporal Joins-Lookup Join

    2023-12-05 15:30:11       47 阅读