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

本文详细介绍了Qt中的QTimer类,包括定时事件timerEvent的使用方法和通过信号槽连接完成的定时任务示例。重点提到了构造函数内使用QTimer时的注意事项,以及如何启动、停止定时器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt——定时器QTimer


QTimer是qt中的单次和重复定时器。
其主要有两种定时方式,一种是定时事件,一种是通过信号与槽。

搬运他人博客:11111111111


一.定时事件timerEvent


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

int id = startTimer(x);

其中,x是定时事件,单位是毫秒ms,startTimer会自动启动该定时器。
返回值是该定时器独一无二的id。
同时需要使用定时事件timerEvent完成具体的定时任务

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

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

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为例。

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函数即可。

t->stop();
### 如何在Qt中连接和使用QTimer #### 创建定时器实例 为了在Qt应用程序中使用`QTimer`,首先需要创建一个`QTimer`对象。这可以通过声明成员变量或局部变量的方式完成。 ```cpp // 成员变量方式 private: QTimer *timer; ``` 或者直接在方法内部创建: ```cpp QTimer timer; ``` #### 连接信号与槽 一旦有了`QTimer`对象,下一步就是将其超时(`timeout`)信号连接到目标槽函数上。对于跨线程操作,可以指定连接型为`Qt::DirectConnection`以确保即时响应[^1]。 ```cpp connect(&timer, &QTimer::timeout, this, &MyClass::onTimeout, Qt::DirectConnection); ``` 这里展示了现代C++风格的语法用于信号槽机制;旧版本可能采用字符串形式表示信号和槽名称。上述代码片段表明每当计时结束触发`timeout()`信号时,都会立即调用`this`指针指向的对象中的`onTimeout()`槽函数执行相应逻辑处理[^2]。 #### 启动定时器 设置好间隔时间之后就可以启动定时器了。有两种常见的方式来设定周期性的事件触发频率——固定的时间间隔或是单次延迟后的触发。 ```cpp // 设置每隔一秒触发一次 timer->start(1000); // 或者仅等待一段时间后再触发一次 timer->singleShot(5000, this, &MyClass::handleSingleShot); ``` 当不再需要定时器工作的时候记得停止它以免造成不必要的资源消耗: ```cpp if (timer != nullptr && timer->isActive()) { timer->stop(); } ``` #### 多线程环境下的注意事项 如果计划让定时器在一个独立的工作线程内运行,则需要注意一些特殊的事项。例如,在子化的`QThread`里应该尽可能早地初始化那些将在该线程上下文中使用的对象(比如这里的`QTimer`),通常是在构造函数期间而不是在线程主体(`run()`)开始之时[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值