【定时器 】 Qt使用定时器 QTimer

环境:Qt5

写作目的:因为要实现实时处理,也就不能用循环做,使用系统定时器能基本满足实时性要求。看过几篇博客,有的介绍不是特别清晰,感觉还是自己写一写,希望对大家有帮助,期待大家也可以推荐更多简洁有效的教程。
一. 首先介绍已经掌握的一种方法,使用TimerEvent,可以响应多个定时器。流程:
  1. 启动定时器,并记录定时器id、设定间隔时间(单位:毫秒);
  2. 自定义定时器事件处理函数(这一点类似嵌入式系统的中断);
  3. 根据定时器id,分别处理需要做的事。
  • 给出代码 :
    1.mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <iostream>
#include <QTimer>
#include <QObject>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    // 定时器id
    int id1, id2;
    // 事件处理函数
    void timerEvent(QTimerEvent *ev);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

2.mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    std::cout<<"start..."<<std::endl;

    // 启动定时器
    id1 = startTimer(1000); // 每个定时器返回一个唯一的id
    id2 = startTimer(2000);

}

MainWindow::~MainWindow()
{
    delete ui;
}

// 定时器处理函数
void MainWindow::timerEvent(QTimerEvent *ev){
    if(ev->timerId() == id1){  // 响应 id 1
        std::cout<< "heheda1"<<std::endl;
    }

    if(ev->timerId() == id2){  // 响应 id 2
        std::cout<<"heheda2"<<std::endl;
    }
}

  • 效果
    在这里插入图片描述

参考:
https://www.bilibili.com/video/av54523708?p=32

感谢up

发布了18 篇原创文章 · 获赞 0 · 访问量 473

猜你喜欢

转载自blog.csdn.net/m0_38139098/article/details/104647093