2011-12-23 68 views
0

我有擁有(擁有指針並初始化)對象Y1..10Qt的:關於式信號/插槽

對象X具有從時時改變的狀態的對象x。 我想讓子對象(Y1..10)知道狀態。

通常情況下,通過從每個Y子對象獲得一個指向父X的指針,以便它可以通過方法調用查詢其狀態,但我不希望Y對象知道對象X ,只是它的地位。

我想知道,這可與信號/插槽來實現:

在Y對象將定義一個信號,諸如:

void GetStatus(TheStatus & status); 

的X對象將這種連接的狹槽,並且當Y對象發出的對象X會將狀態寫入給定的狀態引用,以便Y對象獲取它。

這樣我可以有狀態更新可用於Y對象,但他們不需要知道對象X來實現這一點。

您認爲如何?

回答

1

看起來你正在想它倒退。如果X對象是想要做「通知」的對象,那麼它應該發出信號。然後Y對象將有槽作爲「接收器」。

所以X對象應該被髮射的信號,如:

void X::statusChanged(TheStatus status); 

然後在Y對象有某種匹配插槽。假設適當的私有/公共權限,任何對象或許Z或甚至X和Y本身—可以使用QObject::connect調用將匹配的信號和對象實例的槽連接在一起。你甚至可以將信號綁定到信號上。

雖然有可能您可以通過Y調用某個插槽,如onStatusChanged,這表明您的設計中的耦合太緊張了。畢竟,一個插槽可以像普通的方法一樣被調用。所以如果你能想到確實是而不是以它的調用者爲基礎命名它,這可能更合理。

(如果一個函數foo()調用另一個函數,我們往往給,基於它做什麼新的名稱bar(),而不是theFunctionCalledByFoo()吧?)

這是優選的,因爲馬丁指出,試圖保持插槽使用相當基本的類型並按價值發送它們。如果你發送指針和引用,那麼你會擔心對象的生命週期,特別是在信號/插槽在隊列中處理的多線程場景中。

一個通知基於類的一個很好的例子與玩的簡單的理解可能是進度條:

http://developer.qt.nokia.com/doc/qt-4.8/qprogressbar.html#details

+0

我用doBlah()爲響應就像一個按鈕的事件接收器按和updateBlah()更新gui的一些部分 –

+0

@MartinBeckett進度條有'setValue()',但我不知道這是否比'updateValue()'更好或更差。 「set」對於更新GUI元素的函數可能聽起來有點輕量級,但我可以通過兩種方式看到它。在任何情況下,它都比'onValueChanged()'更好 - 這聽起來像一個信號的名稱,就像一個插槽一樣。 – HostileFork

+0

這並不重要,你叫他們。你只需要有一些約定來保持信號/插槽的功能,因爲編譯器沒有執行任何操作。 –

1

這正是信號/插槽的用途。

任何數量的孩子可以訂閱一個信號,而無需發送代碼需要知道他們,發件人甚至不需要有任何接收器的信號。

一般來說,我會盡量保持由信號/插槽發送的值簡單而不是複雜的對象 - 這樣可以更容易地單獨進行更改。