2016-07-07 10 views
1

のはSomeClassメンバーObject1を持っており、Object2などObject1Object2との間の接続があるとしましょう:SomeClassObject2に追加されたいくつかのリファクタリングObject3Qtの転送信号/スロット接続

connect(Object1, signal1, Object2, slot1) 

がために移動しましたメンバーはObject3ですが、依然としてObject1Object2の間の接続が必要です。

Object1Object2の間の通信は、現在Object3を経由する必要があります。これはObject3が変更される必要があることを意味し、Object1Object2の間の通信を実装するためだけの信号/スロットのペアを追加します。

これは、の.hと.cppの両方が変更されていることを意味しています。

私の怠惰な側面は、この物語には奇妙なことがあると言っています。その接続をもっと簡単にするための方法はありますか?

+0

_ "これは、Object3を変更する必要があることを意味します。" _ - why ???以前のように同じ 'connect(Object1、signal1、Object2、slot1)'が動作します(コード内で 'Object1'と' Object2'がポインタであるとします) – mvidelgauz

答えて

5

Object2Object3にカプセル化しています。 というユーザーの観点からは、Object3は何も変わりません。接続を設定するコードは1行だけです。 Object3には、カプセル化されたObject2インスタンスに転送する余分なスロットが必要です。それはの1つです余分な行はここにあります。以上です。

struct Object1 : QObject { 
    Q_SIGNAL void signal1(); 
    Q_OBJECT 
}; 
struct Object2 : QObject { 
    Q_SLOT void slot1() {} 
    Q_OBJECT 
}; 
class Object3 : QObject { 
    Q_OBJECT 
    Object2 m_object2; 
public: 
    // one line to expose object2's slot 
    Q_SLOT void slot1() { m_object2.slot1(); } 
}; 

class SomeClass { 
    Object1 m_object1; 
    Object3 m_object2; 
public: 
    SomeClass() { 
    // still one line 
    connect(&m_object1, &Object1::signal1, &m_object3, &Object3::slot1); 
    } 
}; 
+0

Q_SLOTとQ_SLOTS(そしてQ-SIGNAL/Q_SIGNALS、EMIT ...)古典的な公開スロットの上に?私は彼らがなぜhttp://doc.qt.io/qt-5/signalsandslots.html#using-qt-with-3rd-party-signals-and-slotsから必要とされているのか理解していますが、これをデフォルトスタイルサードパーティ製の信号とスロットを使用しないでください。 – KcFnMi

+0

@KcFnMiグローバルな名前空間が 'signals'や' slots'のようなマクロによって汚染されないように 'Q_'接頭辞が好まれます。シグナル/スロットの数が少なく、セクション全体を保証しないときは、 'Q_SIGNALS'と' Q_SLOTS'で 'Q_SIGNAL'と' Q_SLOT'を選びます。さらに、信号/スロットは論理的にはしばしば一緒にはならないが、他の方法もある。 '' Q_EMIT'よりも 'emit'を使うのが好きです。なぜなら、コードを非醜い方法でコード化するからです。 'emit' /' Q_EMIT'の使用はオプションですが、人間が消費するためだけです。 –

+0

スロットへの呼び出しはまだこのように非同期ですか( 'Q_SLOT void slot1(){m_object2.slot1();}')? – KcFnMi

関連する問題