首先,Qt对象的基类QObject为我们提供了一个基本的定时器,它是通过定时器事件来触发的。其步骤如下:
step1:通过函数int QObject::startTimer(int interval)函数来启动一个定时器,其中参数interval为时间间隔,其时间单位为毫秒(ms);startTimer()函数的返回类型为int,这个整型数字是定时器的标识符,用来唯一标识这个此时由startTimer函数开启的定时器。
当然,我们可以同时打开多个定时器,并返回不同的定时器标识符,在事件处理函数中,我们可以利用QTimeEvent::timeId()函数来判断当前事件是由那个定时器触发的,后面的例子里面将详细介绍。
step2:开启定时器后,在每个时间间隔后会产生一个QTimeEvent事件,并进入事件循环等待处理;
step3:当等到QTimeEvent事件处理的时候,会调用timeEvent(QTimeEvent*)事件处理函数来处理这个定时器事件;
step4:开启定时器后,定时器事件会一直发生着,然后我们可以调用killTimer(int)函数来结束某个定时器,参数可以指定需要结束的定时器标识符。
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
void timerEvent(QTimerEvent *);
private slots:
void timerUpdate();
private:
Ui::Widget *ui;
int id1, id2, id3;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QTimerEvent>
#include <QTimer>
#include <QDateTime>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
// 开启了三个定时器,分别返回了它们的id,
// 这个id用来区分不同的定时器。定时器的时间单位是毫秒。
// 每当一个定时器溢出时,都会调用定时器事件处理函
id1 = startTimer(1000);
id2 = startTimer(2000);
id3 = startTimer(10000);
QTimer *timer = new QTimer(this);
// 关联定时器溢出信号和相应的槽函数
connect(timer, &QTimer::timeout, this, &Widget::timerUpdate);
timer->start(1000);
}
Widget::~Widget()
{
delete ui;
}
// 定时器事件
void Widget::timerEvent(QTimerEvent *event)
{
// 判断哪个定时器发生
// 每当第一个定时器溢出时都产生一个小于10的随机数;
// 当第二个定时器溢出时,就更改标签的文本;
// 当第三个定时器溢出时则退出应用程序
if (event->timerId() == id1)
{
// qrand()%10可以产生0-9之间的随机数。要想产生100以内的随机数就是%100
ui->label->setText(tr("%1").arg(qrand()%10));
}
else if (event->timerId() == id2)
{
ui->label_2->setText(tr("Hello World!"));
}
else
{
qApp->quit();
}
}
// 时间更新
void Widget::timerUpdate()
{
// 获取系统现在的时间
QDateTime time = QDateTime::currentDateTime();
// 设置系统时间显示格式
QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd");
// 在标签上显示时间
ui->lineEdit->setText(str);
// 产生300以内的正整数
int rand = qrand() % 100;
ui->lineEdit->move(rand, rand);
}
【参考:】
1、 芳草源