【Y忍冬草】Qt之定时器

首先,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、 芳草源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值