は、私はクラスがあると接続シグナルとスロットを維持入れ替えることができます:私はQObjectの子が
class Foo : public QObject{
Q_OBJECT
public:
...
private:
Bar* m_bar;
}
そして、何らかの理由を、私はDerivedBarのオブジェクトへのポインタでm_barを交換したいと思います。よく私が見つけたユースケースは、単体テストのためにMockBarのオブジェクト(google mockフレームワークを使用)に置きたいときです。
Foo(Bar* bar, QObject* parent)
とばかりに応じm_bar設定:
今、私はほとんどの場合、私はちょうどのようなものにするためにコンストラクタを拡張することができ知っています。
しかし、問題は、クラスがQWidgetsであり、Qtデザイナーを使用してそれらをアセンブルしていることです。 FooとBarはウィジェットであり、BarはデザイナーからFooの内部に置かれていると想像してください。それらの接続もデザイナーを介して設定されます(qmlファイルに格納されます)。 (単に機能取得しようとし、ここで任意のメモリリークを無視して)を
Bar* bar = foo.findChild<Bar*>();
bar = new MockBar(&foo);
しかし、私は期待を設定するために行くとき、既存のものだったように接続されていないようです。私のようなものを試してみました。信号に応答してスロットは呼び出されません。私はこれが接続が行われる方法のためにこれが完全に予期しないとは思わないが、私が探している効果を得る方法があるのだろうかと思っている。
(NB:今のところ、QT 4.8とgcc 4.6を使用して、C++
あなたは何を求めているのですか?接続リストを列挙する方法はありますか?正式ではありませんが、プライベートAPIを使用するのは簡単なことですが、これはテストのためだけに行われるため大変なことではありません。互換性のあるスロットを持つ別のオブジェクトに接続のスロットエンドポイントを転送して、接続を複製する必要性を排除することもできます。いくつかの接続を複製することは苦痛であるか、不可能である。ファンクタへの接続。 –
ありがとう、私はいくつかの私の問題を修正する可能性があるので、そのアプローチを見ていきます。しかし、信号/スロットの動作を調べるのではなく、バーで直接関数呼び出しをしようとすると問題が発生する可能性があります。 – shavera