QT定时器
QT定时器
1.概述
这篇文章介绍如何使用定时器
2.定时器
2.1.创建项目
新建一个普通的widget类型项目,在widget.ui文件中添加一个label
控件
2.1.QTimer
在帮助文档搜索timerEvent,查看QTimer Class
类提供的定时器。
该类提供了一个定时事件的函数,他是一个虚函数需要对他进行重写。
复制函数到widget.h
文件中
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
// 重写定时器事件
void timerEvent(QTimerEvent *e);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
在widget.cpp 文件中重写它的功能
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 启动定时器,每隔1秒发送一个事件
startTimer(1000);
}
void Widget::timerEvent(QTimerEvent *e)
{
static int num = 1;
ui->label_2->setText(QString::number(num++));
}
Widget::~Widget()
{
delete ui;
}
启动后,每隔1秒调用一次
总结
这个定时器在使用时候,如果里面有个多个任务,需要用定时器ID区分每个任务,使用起来不是很方便,如下示例。
#include "widget.h"
#include "ui_widget.h"
#include <QTimerEvent>
int id1;
int id2;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 启动定时器,每隔1秒发送一个事件
id1 = startTimer(1000);
id2 = startTimer(2000);
}
//定时事件中如果有多个任务,就需要使用定时器id区分,使用起来不是很方便
void Widget::timerEvent(QTimerEvent *ev)
{
if(ev->timerId() == id1)
{
static int num = 1;
ui->label_2->setText(QString::number(num++));
}
if(ev->timerId() == id2)
{
static int num2 = 1;
ui->label_2->setText(QString::number(num2++));
}
}
Widget::~Widget()
{
delete ui;
}
2.2.对象方式创建定时器
使用QTimer
类提供的定时器,可以创建定时器对象,每个对象控制一个定时任务,使用非常方便
#include "widget.h"
#include "ui_widget.h"
#include <QTimerEvent>
#include <QTimer>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 第二种定时器方式,QTimer创建对象。
QTimer * t1 = new QTimer(this);
//启动定时器
t1->start(1000);
//开发定时器功能
connect(t1, &QTimer::timeout, [=](){
static int num3;
ui->label_4->setText(QString::number(num3++));
});
}