我想一般地暂时阻止两个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,但没有成功)。
发布于 2013-06-22 20:28:56
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;
};发布于 2013-03-27 00:32:50
由于您希望发送方和接收方不在该作用域内发送信号,因此我将尝试使用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);
//...发布于 2013-03-26 18:16:18
您可以使用disconnect(sender, 0, receiver, 0);断开所有sender信号与所有receiver插槽的连接。
https://stackoverflow.com/questions/15633086
复制相似问题