Temporarily block signals between two QObjects

I would like to outline and temporarily block signals between two QObjects without changing the behavior of other signals / slots and without knowing their contexts.

Something like QObject :: blockSignals (bool) , but only valid between two QObjects .

That is, by implementing the following function SignalBlocker::blockSignals(bool) :

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

It would be possible by disconnecting and reconnecting the objects, but first you would need to save the list of signals / slots. Introspection methods do not seem powerful enough to achieve this (I looked unsuccessfully at QMetaObject and QSignalSpy ).

+5
source share
3 answers

QT does not have the ability to disable a pair of signal intervals. Try a workaround:

 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; }; 
+11
source

since you want the sender and receiver not to send signals within this area, I will just try to use blockSignals(bool)

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

and now just use

 SignalBlocker sb1(sender); SignalBlocker sb2(reciever); //... 
+3
source

You can use disconnect(sender, 0, receiver, 0); to disconnect all sender signals from all receiver slots.

0
source

All Articles