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

放置QLCDNumber

定义一个定时器对象: 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();
}

posted @ 2025-03-13 15:47  codels  阅读(993)  评论(0)    收藏  举报