Qt 定时器使用
Object定时器和QTimer的使用
Object定时器
创建一个整型对象存放定时器的id
int myTimerId;
启动定时器:
startTimer() 函数会启动定时器并返回其id,例中的 this 是一个指向 QWidget 对象的指针,由于该类继承于 QObject 类,所以可以直接调用 startTimer() 函数。
//启动定时器,并约定每2000毫秒触发一次事件
myTimerId = this->startTimer(2000);
重写 timerEvent(QTimerEvent * event) 函数,该函数每隔2000ms会被执行一次。
函数声明
[virtual protected] void QObject::timerEvent(QTimerEvent *event)
重写
void MyClass::timerEvent(QTimerEvent *event) {
//在这里写下操作
}
关闭定时器:
使用 killTimer() 函数即可关闭定时器
原型:
void QObject::killTimer(int id)
示例:
this->killTimer(myTimerId);
QTimer定时器
使用方法
创建定时器对象
QTimer * timer = new QTimer();
启动定时器,并约定timeout时间为2000ms
timer->start(2000);
上述定时器会每隔2000ms发送一个timeout信号,此时利用该信号调用槽函数来处理
connect(timer, &QTimer::timeout, this, 处理该信号的槽函数指针);
关闭定时器
timer->stop();
例: 在 QLCDNumber 上实现一个一个一个倒计时
做法:
新建一个Widget项目, 在其界面上放置一个 QLCDNumber 控件, 命名为 lcdNumber

定义一个定时器对象: myTimer 和处理 timeout 的槽函数
private:
//定义一个定时器指针
QTimer * myTimer;
private slots:
//定时器事件处理的槽函数
void onMyTimer();
在构造函数中实例化 myTimer, 并启动:
//创建一个定时器对象
myTimer = new QTimer();
//启动定时器, 每过一秒发一个TIMEOUT信号, 此处写1000是因为它的单位是毫秒
myTimer->start(1000);
绑定 QTimer::timeout 信号与处理它的槽函数 onMyTimer()
connect(
myTimer, //信号发出者
&QTimer::timeout, //发出的信号
this, //信号处理者
&QTimerTest::onMyTimer //处理信号的槽函数
);
实现 onMyTimer();
void QTimerTest::onMyTimer() {
// qDebug() << "又过去一秒了";
//拿到LCD上的数字
int value = ui->lcdNumber->intValue();
//如果数字倒计时到0, 定时器停止, 函数返回
//否则: LCD上的数字-1
if (value <= 0) {
myTimer->stop();
return;
}
else {
ui->lcdNumber->display(value - 1);
}
}
完整代码:
QTimerTest.h:
//用定时器在LCD上实现一个倒计时
#ifndef QTIMERTEST_H
#define QTIMERTEST_H
#include <QWidget>
#include <QTimer>
namespace Ui {
class QTimerTest;
}
class QTimerTest : public QWidget
{
Q_OBJECT
public:
explicit QTimerTest(QWidget *parent = nullptr);
~QTimerTest();
private:
Ui::QTimerTest *ui;
//定义一个定时器指针
QTimer * myTimer;
private slots:
//定时器事件处理的槽函数
void onMyTimer();
};
#endif // QTIMERTEST_H
QTimerTest.cpp:
#include "QTimerTest.h"
#include "ui_QTimerTest.h"
#include <QDebug>
QTimerTest::QTimerTest(QWidget *parent)
: QWidget(parent)
, ui(new Ui::QTimerTest)
{
ui->setupUi(this);
//创建一个定时器对象
myTimer = new QTimer();
//启动定时器, 每过一秒发一个TIMEOUT信号
myTimer->start(1000);
//绑定TIMEOUT信号与处理它的槽函数
connect(myTimer, &QTimer::timeout, this, &QTimerTest::onMyTimer);
//设置lcd的初值
ui->lcdNumber->display(11);
}
QTimerTest::~QTimerTest()
{
delete ui;
}
void QTimerTest::onMyTimer() {
// qDebug() << "又过去一秒了";
//拿到LCD上的数字
int value = ui->lcdNumber->intValue();
//如果数字倒计时到0, 定时器停止, 函数返回
//否则: LCD上的数字-1
if (value <= 0) {
myTimer->stop();
return;
}
else {
ui->lcdNumber->display(value - 1);
}
}
main.cpp:
#include "widget.h"
#include "QTimerTest.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//测试QTimer + LCD
QTimerTest q;
q.show();
return a.exec();
}
浙公网安备 33010602011771号