我想在不修改其他信号/插槽行为的情况下,一般地暂时阻止两个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;
}
通过断开和重新连接对象是可能的,但首先必须存储信号/插槽列表。
内省方法似乎不足以实现这一目标(我看了QMetaObject
和QSignalSpy
没有成功)。
答案 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
的信号。