Qt 临时阻断两个QoObject之间的信号

Qt 临时阻断两个QoObject之间的信号,qt,signals,qobject,slot,Qt,Signals,Qobject,Slot,我希望在不修改其他信号/插槽行为的情况下,在不知道其上下文的情况下,一般性地临时阻止两个qobject之间的信号 类似于,但仅在两个qObject之间起作用 也就是说,实现以下SignalBlocker::blockSignals(bool)功能: class SignalBlocker { public: SignalBlocker(QObject *sender, QObject *receiver) : mSender(sender), mReceiver(receiver)

我希望在不修改其他信号/插槽行为的情况下,在不知道其上下文的情况下,一般性地临时阻止两个
qobject
之间的信号

类似于,但仅在两个
qObject
之间起作用

也就是说,实现以下
SignalBlocker::blockSignals(bool)
功能:

class SignalBlocker {

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

private:
  QObject *mSender, *mReceiver;
}
可以通过断开连接和重新连接对象,但首先必须存储信号/插槽列表。
内省方法似乎不够强大,无法实现这一点(我查看了
QMetaObject
QSignalSpy
但没有成功)。

您可以使用
断开连接(发送方,0,接收方,0)
要断开所有
发送方
信号与所有
接收方
插槽的连接。

由于您希望发送方和接收方不会在该范围内发送信号,我将尝试使用
块信号(bool)

现在只要使用

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

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;
};

确实如此,但我希望在重新连接对象时能够检索到与断开连接之前相同的状态。因此,在断开连接之前,我应该列出发送方和接收方之间的所有信号/插槽连接(这是我无法做到的一点)。尝试使用类似于
void QObject::connectNotify(const char*signal)[virtual protected]
void QObject::disconnectNotify(const char*signal)[virtual protected]
获取已连接/已断开的信号列表,但我认为您做的事情不对。为什么需要它?不幸的是,这仍然不能解决我的问题,因为在这种情况下,发送方和接收方完全被阻止(它们无法向第三个QObject发送消息,而这正是我需要的).也许可以创建一个类,如
SignalBlocker
,并为对象提供一个模板函数指针,指示要阻止的内容。。。所以它会阻止你想要的信号
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;
};