2010-08-03 45 views
1

假設我們有follogin UI:信號和槽在多層UI部件

+--------------------------+ 
|W1  +--------------+ | 
|   |W2   | | 
|   | +----------+ | | 
|   | |W3  | | | 
|   | +----------+ | | 
|   |    | | 
|   +--------------+ | 
+--------------------------+ 

W3是有意在W1 emited某一信號(或以下的水平,即qApp)。

這個想法是獨立開發W3。但有人必須做信號/插槽連接。

如果我們希望W3不知道任何其他小部件,並且我們不想讓W1知道W3,那麼將W1中的信號連接到W3中的插槽會是一種很好的做法/推薦方式?

解決方案1: 將W1中的信號與W2中的信號(信號到信號技術)連接起來,因此將W2中的信號連接到W3中的槽中。

解決方案2: 生成qApp信號並將其連接到W2中的插槽W3中。

解決方案3: 生成一個qApp信號,並讓W3自己使用它自己的插槽連接到它。

感謝

回答

3

通常,封裝小部件將小部件封裝在其中並提供更高級別的接口。例如,如果W3包含若干需要根據某些狀態啓用/禁用的小部件,則W3將管理該狀態,爲其提供API並相應地啓用/禁用小部件。所以通常不需要直接從W1到W3。

如果小部件彼此不知道(例如,b/c W1是一個可以嵌入任何東西的通用容器小部件),那麼組裝UI的人知道所有涉及的小部件,都應該進行連接。

我不知道「qApp信號」是什麼意思,但這聽起來太像中心對象連接到所有東西,這當然也不是好的設計。

也許你有一個具體的例子,你有什麼想法?

+0

感謝您的回答。我認爲把W2需要的東西封裝起來是有道理的。 W2只需要公開一個插槽,誰連接他們將負責該插槽的調用。之後,W2將使用W3的這些信息。 *** qApp是一個與Qt一起訪問QApplication對象的宏,並且可以從代碼中的任何地方訪問它。通過執行connect(qApp,SIGNAL(someCustomSignal()),this,SLOT(someSlot()))可以連接QApplication實例中的信號。 – Daniel 2010-08-03 22:24:23

+0

是的,那麼我正確理解你的qApp想法。 (和我的反對它的批評論據適用;))。我個人儘量避免在小部件中使用QApplication。假設某個具有自定義信號/槽的QApplication子類將它們連接在一起。 通常我根本不會繼承QApplication。 我寧願讓一些小部件知道彼此,而不是通過一個全能的QApplication對象隱含地綁定在一起。 – 2010-08-04 21:53:54

1

我們這裏使用的方法是「殼」,使連接。

shell是一個知道所涉及的所有小部件的對象。在這種情況下,W1,W2和W3。通常它是組裝用戶界面的代碼。

如果shell不知道W3(因爲W3是一個實現細節,例如),那麼W3的「所有者」應該建立連接等等。

+0

感謝您的回覆。 我發現你的方法的問題是,如果W3包含另一個小部件W4,而W4又包含W5等等,並且鏈中的最後一個小部件需要知道從W1發出的信號,這意味着要使在每個級別的連接。這在通常的做法中可以接受嗎? – Daniel 2010-08-03 19:11:44

+0

W4,W5等是W3公共接口的一部分嗎?如果是這樣,並且整個複合材料不需要連接,那麼在W3之外進行。否則,封裝將被違反。 – andref 2010-08-03 19:20:25