环境:Qt5
写作目的:因为要实现实时处理,也就不能用循环做,使用系统定时器能基本满足实时性要求。看过几篇博客,有的介绍不是特别清晰,感觉还是自己写一写,希望对大家有帮助,期待大家也可以推荐更多简洁有效的教程。
一. 首先介绍已经掌握的一种方法,使用TimerEvent,可以响应多个定时器。流程:
- 启动定时器,并记录定时器id、设定间隔时间(单位:毫秒);
- 自定义定时器事件处理函数(这一点类似嵌入式系统的中断);
- 根据定时器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;
}
}
- 效果
二.直接新建对象
.h文件中
QTimer *timer; //
cpp中:
timer = new QTimer(this); // 定时器
timer->setInterval(60); //设置间隔 毫秒
connect(timer, SIGNAL(timeout()), this, SLOT(initit()));
timer->start();
这里init()就是要回调的函数,需要自己定义,并且放在private slots 里面声明!
在此推荐使用第二种方法,用起来很爽主要是。 – 2020.3.22
参考:
https://www.bilibili.com/video/av54523708?p=32
感谢up