【Qt】QTimer类——定时器的两种使用方法

Qt------定时器QTimer


文章目录

QTimer是qt中的单次和重复定时器。

其主要有两种定时方式,一种是定时事件,一种是通过信号与槽。

搬运他人博客:11111111111


一.定时事件timerEvent

在需要定时器的类中使用startTimer(x)进行定时设置和启动。

int id = startTimer(x);

其中,x是定时事件,单位是毫秒ms,startTimer会自动启动该定时器。

返回值是该定时器独一无二的id。

同时需要使用定时事件timerEvent完成具体的定时任务

cpp 复制代码
void timerEvent(QTimerEvent* ev){
    if(ev->timerId() == id){//判断是否是定时器id
        //该定时器具体的定时事件
    }
    if(ev->timerId() == id2){//判断是否是定时器id2
        //该定时器2具体的定时事件
    }
    ...
}

比如我们希望每隔1秒打印一次hello:

cpp 复制代码
Widget::Widget(QWidget *parent)//构造函数
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    id1 = startTimer(1000);//id1已经设置为成员变量
}
void Widget::timerEvent(QTimerEvent* ev){//定时事件
    if(ev->timerId() == id1){
        qDebug() << "hello";
    }
}

问题:似乎只能开不能控制关?


二.QTimer对象

大多数情况下我们通过使用信号与槽connect的形式完成定时任务。

首先创建一个QTimer类对象,调用start函数完成定时和启动。

之后将QTimer对象的timeout信号与自定义的任务槽函数connect即可。

同样以每隔1秒打印一次hello为例。

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QTimer* t = new QTimer(this);//加入对象树
    t->start(1000);
    //以lambda表达式的形式设置槽函数
    connect(t, &QTimer::timeout, [=]{
        qDebug() << "hello";
    });
}

值得注意的是,即便是构造函数内部的控件,如果是在lambda表达式中定义的,那么也需要使用show函数才能展示出来。尤其是使用QTimer对象时,因为经常使用lambda表达式,需要格外注意这种情况。

如果需要停止定时器,使用stop函数即可。

cpp 复制代码
t->stop();
相关推荐
委婉待续10 小时前
Qt的学习(一)
开发语言·qt·学习
笨笨马甲10 小时前
Qt Quick Layout功能及架构
开发语言·qt
feiyangqingyun11 小时前
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
c++·qt·udp·gb28181
jllws112 小时前
Qt学习及使用_第1部分_认识Qt---学习目的及技术准备
qt·c++框架
到点就困告12 小时前
海康工业相机SDK二次开发(VS+QT+海康SDK+C++)
数码相机·qt·海康
唐墨1231 天前
android与Qt类比
android·开发语言·qt
道剑剑非道1 天前
QT开发技术【ffmpeg + QAudioOutput】音乐播放器 完善
开发语言·qt·ffmpeg
不惑_1 天前
用 PyQt5 打造一个可视化 JSON 数据解析工具
开发语言·qt·json
誰能久伴不乏1 天前
Qt 开发中的父类与父对象的区别和父对象传递:如何选择 `QWidget` 或 `QObject`?
java·开发语言·qt
誰能久伴不乏1 天前
理解继承与组合的本质:Qt 项目中的设计选择指南
开发语言·qt