Qt两种定时器

QT 中使用定时器,有两种方式:

  • 定时器类:QTimer
  • 定时器事件:QEvent::Timer,对应的子类是 QTimerEvent

简单讲一下两种用法:

QTimer:

复制代码
QTimer 需要创建QTimer对象
复制代码
  然后需要给定时器绑定 定时器超时的槽函数,也就是时间到了,该做什么
复制代码
 一般用按钮控制定时器,所以跟按钮关联的槽函数一般里面有start,stop就是控制定时器的
复制代码
 这样通过按钮点击之后,调用里面Qtimer的start,因为外面绑定了定时器超时槽函数,所以
复制代码
 定时器到时间了就会调用超时槽函数,完成业务逻辑

QTimerEvent:

复制代码
 需要重写void QObject::timerEvent(QTimerEvent *event)
复制代码
 当定时时间到的时候会自动调用timerEvent
复制代码
 用timerId可以获取哪个定时器的id
复制代码
 startTimer()可以设置定时器时间间隔 ms
复制代码
 killTimer停止定时器
复制代码
对于 QTimerEvent不用重写定时器超时函数并且再手动绑定,QTimerEvent他会自动调用timerEvent,该函数将自动在使用startTimer函数启动的定时器到期时被调用,所以只需要重写这个就行

下面举一个案例:看看实际项目中怎么用

这有一个定时器任务的页面,无ui的,手撕代码去写

.h

cpp 复制代码
#ifndef TIMEREVENT_H
#define TIMEREVENT_H

#include <QWidget>
#include <QTimer>
#include <QTimerEvent>
#include <QLabel>

class TimerEvent : public QWidget
{
    Q_OBJECT
public:
    explicit TimerEvent(QWidget *parent = nullptr);
private slots:
    void startclick();
    void pauseclick();
    void restartclick();

    //用QTimer,定时器超时的槽函数
    void timerout1();
    void timerout2();
private:
    QLabel* lab1;
    QLabel* lab2;
    int id1;
    int id2;
    //QTimer
    QTimer *tm1;
    QTimer *tm2;
private:
    //QTimerEvent
    void timerEvent(QTimerEvent *event);
signals:

};

#endif // TIMEREVENT_H

.cpp

cpp 复制代码
#include "timerevent.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QDebug>




//  定时器事件
/*
 * 做定时器有两种方式,一种QTimer类,一种是QEvent的Timer事件 ,用到的子类是QTimerEvent
 * 用两种都去实现一下
 * 1.QTimerEvent
 * 需要重写void QObject::timerEvent(QTimerEvent *event)
 * 当定时时间到的时候会自动调用timerEvent
 * 用timerid可以获取哪个定时器的id
 * startTimer()可以设置定时器时间间隔 ms
 * killTimer停止定时器
 *
 * 2.
 *QTimer 需要创建QTimer对象
 * 然后需要给定时器绑定 定时器超时的槽函数
 * 一般在按钮里面有start,stop就是控制定时器的
 * 这样通过按钮点击之后,调用里面Qtimer的start,因为外面绑定了定时器超时槽函数,所以
 * 定时器到时间了就会调用超时槽函数
 * 对于 QTimerEvent不用重写超时函数并且去手动绑定,他会自动调用timerEvent,只需要重写这个就行
 * */
TimerEvent::TimerEvent(QWidget *parent) : QWidget(parent)
{
    //垂直布局
    QVBoxLayout *vblayout = new QVBoxLayout(this);
    vblayout->setSpacing(0);
    vblayout->setContentsMargins(0,0,0,0);

    //
    QLabel *ql = new QLabel(this);
    ql->setText("定时器事件");
    ql->setFixedHeight(50);
    ql->setAlignment(Qt::AlignCenter);
    ql->setFrameShape(QFrame::Box);
    ql->setStyleSheet("color:green;font:25px;background-color:rgb(0,233,233);border-radius:10px;"
                      );
    vblayout->addWidget(ql);

    //第一个标签
    lab1 = new QLabel(this);
    lab1->setFixedSize(95,95);
    lab1->setFrameShape(QFrame::Box);
    lab1->setStyleSheet("background-color:yellow");
    vblayout->addWidget(lab1);
    //第二个标签
    lab2 = new QLabel(this);
    lab2->setFixedSize(95,95);
    lab2->setFrameShape(QFrame::Box);
    lab2->setStyleSheet("background-color:purple");
    vblayout->addWidget(lab2);
    //三个按钮
    QPushButton* start= new QPushButton(this);
    start->setText("开始");
    QPushButton* pause= new QPushButton(this);
    pause->setText("暂停");
    QPushButton* restart= new QPushButton(this);
    restart->setText("复位");
    this->setStyleSheet(R"(
                        QPushButton{
                        font-size:20px;
                        })");
    //水平布局
    QHBoxLayout *hb = new QHBoxLayout(this);
    hb->setSpacing(0);
    hb->setContentsMargins(0,0,0,0);

    hb->addWidget(start);
    hb->addWidget(pause);
    hb->addWidget(restart);
    vblayout->addLayout(hb);

    //按键的信号槽
    connect(start,&QPushButton::clicked,this,&TimerEvent::startclick);
    connect(pause,&QPushButton::clicked,this,&TimerEvent::pauseclick);
    connect(restart,&QPushButton::clicked,this,&TimerEvent::restartclick);

    //Qtimer绑定的信号槽
    tm1 = new QTimer(this);
    tm2 = new QTimer(this);
    connect(tm1,&QTimer::timeout,this,&TimerEvent::timerout1);
    connect(tm2,&QTimer::timeout,this,&TimerEvent::timerout2);
}

void TimerEvent::startclick()
{
#ifdef USR_TIMER_EVENT
    qDebug()<<"use timerevent";
    id1=startTimer(10);
    id2=startTimer(20);
#else
    qDebug()<<"use Qtimer";
    tm1->start(10);
    tm2->start(20);
#endif
}

void TimerEvent::pauseclick()
{
#ifdef USR_TIMER_EVENT
    qDebug()<<"use timerevent";
    killTimer(id1);
    killTimer(id2);
#else
    qDebug()<<"use Qtimer";
    tm1->stop();
    tm2->stop();
#endif
}

void TimerEvent::restartclick()
{
    lab1->move(0,lab1->y());
    lab2->move(0,lab2->y());
}
//Qtimer
void TimerEvent::timerout1()
{
    lab1->move(lab1->x()+5,lab1->y());
    if(lab1->x()>=this->width()){
        lab1->move(0,lab1->y());
    }

}

void TimerEvent::timerout2()
{
    lab2->move(lab2->x()+5,lab2->y());
    if(lab2->x()>=this->width()){
        lab2->move(0,lab2->y());
    }
}
//timerevent
void TimerEvent::timerEvent(QTimerEvent *event)
{
    //当定时器时间到了,看是哪个定时器
    if(event->timerId()==id1){
        lab1->move(lab1->x()+5,lab1->y());
        if(lab1->x()>=this->width()){
            lab1->move(0,lab1->y());
        }
    }
    if(event->timerId()==id2){
        lab2->move(lab2->x()+5,lab2->y());
        if(lab2->x()>=this->width()){
            lab2->move(0,lab2->y());
        }
    }
}
相关推荐
朝朝辞暮i7 小时前
C++ 第 26 课:对象、指针与 ->
java·开发语言·c++
2601_962885727 小时前
如何用 Python 做股价历史分位选股?(筛出处于历史低位的股票)
开发语言·python
殷色玫瑰8 小时前
C++入门基础复习:从命名空间到引用与nullptr,一篇重新捡回C++基础
java·开发语言·c++
(Charon)8 小时前
【C++面试】手写线程池:任务队列、工作线程与优雅退出
开发语言·c++
言乐68 小时前
Python概括后端原理
开发语言·python·django·virtualenv·pygame
@大迁世界9 小时前
JEV RAG:更高效的 RAG 系统解决方案?
开发语言·rust
朝朝辞暮i9 小时前
C++ 第一阶段总结:从零基础到 ROS2 前置语法
开发语言·c++·算法
2601_962885729 小时前
如何用 Python 回测定投策略(定期定额 DCA)?(和一次性买入对比)
开发语言·人工智能·python
周杰偷奶茶10 小时前
【JavaSE】类和对象基础
java·开发语言
大圣编蚕10 小时前
C语言核心知识复习:预处理、头文件、强制类型转换、错误处理、递归与内存管理
c语言·开发语言