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

Fab*_*rer 5 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;
}
Run Code Online (Sandbox Code Playgroud)

通过断开和重新连接对象是可能的,但首先必须存储信号/时隙列表.似乎自省方法不足够强大来实现这一(我看了看QMetaObject,并QSignalSpy没有成功).

Ole*_*leg 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;
};
Run Code Online (Sandbox Code Playgroud)