QT系列教程(16) 定时器事件

定时器

Qt中提供了两种方式实现定时器,第一种是通过startTimer的方式启动定时器,该函数返回定时器的id,然后我们需要为实现定时器的类重写timerEvent。我们先介绍这一种,创建Qt Application项目,项目默认的类名为Widget,继承自QWidget。

重写timerEvent

我们在QWidget类里先声明三个定时器的id,并且声明我们要重写的timerEvent事件

cpp 复制代码
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    virtual void timerEvent(QTimerEvent *event);
private:
    Ui::Widget *ui;
    int id1;
    int id2;
    int id3;
};

接下来我们在构造函数中启动三个定时器

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    id1 = startTimer(1000);
    id2 = startTimer(1500);
    id3 = startTimer(2000);
}

在析构函数中回收三个定时器

cpp 复制代码
Widget::~Widget()
{
    delete ui;
    killTimer(id1);
    killTimer(id2);
    killTimer(id3);
}

然后重写timerEvent,进而实现三个定时器的功能

cpp 复制代码
void Widget::timerEvent(QTimerEvent *event)
{
    if(event->timerId() == id1){
        qDebug() << "id1 timer triggered" ;
    }

    if(event->timerId() == id2){
        qDebug() << "id2 timer triggered" ;
    }

    if(event->timerId() == id3){
        qDebug() << "id3 timer triggered" ;
    }
}

运行程序后,就可以看到三个定时器被调用,并且根据每个定时器的id输出信息。

QTimer实现定时器

我们在Widget的声明中,添加一个槽函数

cpp 复制代码
class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    virtual void timerEvent(QTimerEvent *event);
    void slot_update_led();
private:
    Ui::Widget *ui;
    int id1;
    int id2;
    int id3;
};

接下来我们在Widget的构造函数中初始化一个定时器,并且连接定时器发出的信号和槽函数,然后启动定时器

cpp 复制代码
QTimer * timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &Widget::slot_update_led);
timer->start(1000);

然后我们在ui里添加一个lcdnumber的控件,用来显示当前的时间,然后在定时器的槽函数slot_update_led中设置lcdnumber显示时间信息

cpp 复制代码
void Widget::slot_update_led()
{
       QTime time = QTime::currentTime();
       QString text = time.toString("hh:mm:ss");
       //qDebug() << " current time is " << text;
       if(time.second()%2==0){
           text[5] = ' ';
           text[2] = ' ';
       }
       ui->lcdNumber->setDigitCount(text.length());
       ui->lcdNumber->display(text);
}

程序运行后,就可以根据定时器每个一秒获取时间信息显示在lcdNumber上了。

源码链接

源码链接

th());

ui->lcdNumber->display(text);

}

复制代码
程序运行后,就可以根据定时器每个一秒获取时间信息显示在lcdNumber上了。
## 源码链接
源码链接
[https://gitee.com/secondtonone1/qt-learning-notes](https://gitee.com/secondtonone1/qt-learning-notes)
相关推荐
一棵开花的树,枝芽无限靠近你1 小时前
【face-api.js】2️⃣ NetInput - 神经网络输入封装类
开发语言·javascript·神经网络
yongche_shi1 小时前
第九十九篇:Python在其他领域的应用:游戏开发、物联网、AIoT简介
开发语言·python·物联网·游戏开发·aiot
froginwe111 小时前
Node.js 回调函数
开发语言
期待のcode1 小时前
Java中的继承
java·开发语言
资深低代码开发平台专家1 小时前
MicroQuickJS:为极致资源而生的嵌入式JavaScript革命
开发语言·javascript·ecmascript
世转神风-1 小时前
qt-通信协议基础-固定长度-小端字节序补0x00指导
开发语言·qt
期待のcode1 小时前
Java中的super关键字
java·开发语言
TM1Club1 小时前
Zoey的TM1聊天室|#3 合并报表提速:业财一体如何实现关联方对账自动化
大数据·开发语言·人工智能·经验分享·数据分析·自动化·数据库系统
Selegant1 小时前
百万 QPS 下的 Java 服务调优:JVM 参数、GC 策略与异步非阻塞编程
java·开发语言·jvm
趣知岛1 小时前
Java反射和设计模式
java·开发语言·设计模式·反射