Qt 断开信号槽的方式

项目场景:

        经常会碰到一些场景,数据处理时需要短暂的断开信号和槽的连接,但是处理完又需要保持连接,用于更新状态。


解决办法:

方法一:

        需要断开的地方diconnect,需要连接的地方connect,最简单直接的办法,但是会很繁琐,如果频繁操作,多出了非常多的重复代码,逻辑混乱。

        disconnect(&sender, SIGNAL(someSignal()), this, SLOT(someSlot()));
   
        connect(&sender, SIGNAL(someSignal()), this, SLOT(someSlot()));

方法二:

        使用标志位,通过条件判断的方式控制功能的开关。但是这么做有点底层状态机的模子,看起来也复杂。

#include <QObject>

class MyClass : public QObject {
    Q_OBJECT
public:
    MyClass() : isEnabled(true) {
        connect(&sender, SIGNAL(someSignal()), this, SLOT(someSlot()));
    }

    void temporarilyDisable() {
        isEnabled = false;
    }

    void enable() {
        isEnabled = true;
    }

private slots:
    void someSlot() {
        if (isEnabled) {
            // slot 
            // true handle
        }
    }

private:
    QObject sender;
    bool isEnabled;
};

方法三:

        使用官方QSignalBlocker,这个是这种场景下最推荐的,用于阻塞对象的所有信号,而且是作用域生效,超出作用域后自动解除。

#include <QObject>
#include <QSignalBlocker>

class MyClass : public QObject {
    Q_OBJECT
public:
    MyClass() {
        connect(&sender, SIGNAL(someSignal()), this, SLOT(someSlot()));
    }

    void performOperationWithSignalsBlocked() {
        {
            QSignalBlocker blocker(sender);
            // Perform operations while signals are blocked
        }
        // Signals are unblocked here
    }

private slots:
    void someSlot() {
        // slot implementation
    }

private:
    QObject sender;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雲烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值