5

QObjects他のシグナル/スロットの動作を変更せずに、またそれらのコンテキストを知らずに、2つの間のシグナルを一般的かつ一時的にブロックしたいと思います。

QObject :: blockSignals(bool)のようなものですが、2つの間でのみ動作しQObjectsます。

つまり、次のSignalBlocker::blockSignals(bool)関数を実装します。

class SignalBlocker {

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

private:
  QObject *mSender, *mReceiver;
}

オブジェクトを切断して再接続することで可能になりますが、最初に信号/スロットのリストを保存する必要があります。イントロスペクションの方法は、これを達成するのに十分強力ではないようです(私は成功したかどうかを調べましQMetaObjectQSignalSpy)。

4

3 に答える 3

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;
};
于 2013-06-22T12:28:55.763 に答える
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);
//...
于 2013-03-26T16:32:49.580 に答える
0

を使用して、すべてのスロットからすべての信号disconnect(sender, 0, receiver, 0);を切断できます。senderreceiver

于 2013-03-26T10:16:18.460 に答える