I would like to generically and temporarily block the signals between two QObjects
without modifying the other signals/slots behavior, and without knowing their contexts.
Something like QObject::blockSignals(bool), but only acting between two QObjects
.
That is, implementing the following SignalBlocker::blockSignals(bool)
function:
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 disconneting and re-connecting the objects, but first the list of signals/slots would have to be stored.
Introspection methods don't seem to be powerful enough to achieve this (I looked at QMetaObject
and QSignalSpy
without success).
QT have no capabilities to disable signal-slot pair only. Try this 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;
};