暂时阻止两个QObject之间的信号

时间:2013-03-26 09:08:10

标签: qt signals qobject slot

我想在不修改其他信号/插槽行为的情况下,一般地暂时阻止两个QObjects之间的信号,并且不知道它们的上下文。

QObject::blockSignals(bool)这样的东西,但只在两个QObjects之间起作用。

即,实现以下SignalBlocker::blockSignals(bool)函数:

class SignalBlocker {

public:
  SignalBlocker(QObject *sender, QObject *receiver) :
    mSender(sender), mReceiver(receiver) {}
  void blockSignals(bool block);

private:
  QObject *mSender, *mReceiver;
}

通过断开和重新连接对象是可能的,但首先必须存储信号/插槽列表。 内省方法似乎不足以实现这一目标(我看了QMetaObjectQSignalSpy没有成功)。

3 个答案:

答案 0 :(得分:11)

QT无法仅禁用信号槽对。试试这个解决方法:

struct SignalDisabler
{
    SignalDisabler(const QObject *sender, const char *signal, const QObject *receiver, const char *member)
        : sender(sender)
        , signal(signal)
        , receiver(receiver)
        , member(member)
    {
        QObject::disconnect(sender, signal, receiver, member);
    }

    ~SignalDisabler()
    {
        QObject::connect(sender, signal, receiver, member);
    }

    const QObject *sender;
    const char *signal;
    const QObject *receiver;
    const char *member;
};

答案 1 :(得分:3)

因为您希望发送方和接收方不会在该范围内发送信号,我只会尝试使用blockSignals(bool)

class SignalBlocker{
public:
SignalBlocker(QObject* obj)
{
   _o = obj;
   _o->blockSignals(true);
}
~SignalBlocker()
{
   _o->blockSignals(false);
}
private:
   QObject* _o;
};

现在只需使用

SignalBlocker sb1(sender);
SignalBlocker sb2(reciever);
//...

答案 2 :(得分:0)

你可以使用disconnect(sender, 0, receiver, 0);断开所有sender插槽中所有receiver的信号。