又一个Qt的bug吗?QTimer的lambda函数

Qt定时器与Lambda表达式
探讨使用Qt的QTimer与Lambda表达式结合时遇到的问题,特别是在Qt::UniqueConnection参数失效的情况下,如何避免多次点击按钮导致的资源浪费。通过加入disconnect解决重复连接问题。

用的越多,越有想法。

本想着用lambda简化一下代码,结果出了问题,跟踪调试了一下,发现怀疑是Qt的。

代码如下。

void MainWindow::on_pushButton_clicked()
{
    int max = 0;
    connect(&m_dTimer, &QTimer::timeout, this, [=]()mutable{
        qDebug() << "fffffff" << max;
        max++;
        if(max >= m_max)
        {
            m_dTimer.stop();
//            m_dTimer.disconnect();
        }
     }, Qt::UniqueConnection);
    m_dTimer.start(500);
}

很简单,可是也很怪异的是Qt::UniqueConnection这个参数竟然不起作用了。

点击多次按钮,就可以看出来问题。只加入一个disconnect来结束。

Qt 中,窗口关闭后 `QTimer` 是否继续运行取决于多个因素,包括定时器的父对象关系、定时器的类型以及窗口关闭时的处理逻辑。 如果 `QTimer` 是某个窗口部件(如 `QDialog` 或 `QWidget`)的子对象,则当窗口关闭并被销毁时,该 `QTimer` 也会被自动销毁,从而停止运行。这是由于 Qt 的父子对象管理机制,当父对象被删除时,所有子对象也会被自动删除[^3]。 然而,如果 `QTimer` 是独立创建的,即没有设置父对象,或者它属于某个未被销毁的对象,则在窗口关闭后它仍然可以继续运行。此时,需要手动管理 `QTimer` 的生命周期,确保在窗口关闭时调用 `stop()` 方法停止定时器,以避免潜在的资源泄漏或无效操作。 示例代码如下,展示在窗口关闭时停止 `QTimer` 的典型做法: ```cpp class MyDialog : public QDialog { Q_OBJECT public: MyDialog(QWidget *parent = nullptr) : QDialog(parent) { timer = new QTimer(this); // 设置父对象为窗口,窗口关闭时自动销毁 connect(timer, &QTimer::timeout, this, &MyDialog::onTimeout); timer->start(1000); // 每秒触发一次 } ~MyDialog() { // 不需要手动删除 timer,因为设置了父对象为 this } private slots: void onTimeout() { // 处理定时器事件 } private: QTimer *timer; }; ``` 若未将 `QTimer` 设置为窗口的子对象,则应在窗口的 `closeEvent()` 或 `reject()` 等方法中手动调用 `stop()`: ```cpp void MyDialog::closeEvent(QCloseEvent *event) { if (timer) { timer->stop(); } QDialog::closeEvent(event); } ``` 综上所述,窗口关闭后 `QTimer` 是否继续运行取决于其是否被销毁或手动停止。若其父对象为窗口部件,则会随窗口销毁而停止;否则需手动管理其生命周期以确保其停止运行。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值