2010-11-14 83 views
4

Qt信號/插槽是否遵循本機C++的範圍?我可以訪問超出範圍的Qt信號/對象插槽嗎?

比方說,我有以下類:樓,廚房,酒窖,爐竈保質

class House {Kitchen kitchen, Cellar cellar;}; 
class Kitchen {Stove stove;}; 
class Cellar {Shelf shelf;}; 

現在我想發送一個信號從地窖裏的架子到廚房裏的爐子。通過將貨架上的信號連接到地下室的信號和從廚房到爐子的插槽,然後在連接地窖和廚房的房間中進行連接,唯一的方法就是做到這一點。或者有沒有辦法直接做到這一點?

我有一個類需要與用戶界面進行通信,我不知道是否需要通過中間類「代理」所有各種信號/插槽。或者這是不良設計的一個指標?

+0

如果某人回答了您的問題並附有幫助您的答案,請將其標記爲正確答案。 – g19fanatic 2010-11-18 12:34:57

回答

3

你可以用House的任何方法進行連接,因爲你可以訪問這兩個對象。 「連接器」必須能夠在編譯時訪問發送者和接收者,這就是它的全部。

3

你應該能夠只從貨架實例鏈接的信號火爐實例

在衆議院

connect(cellar->shelf,SIGNAL(signalHere()),kitchen->stove,SLOT(slotHere()));

只是確保shelfstove是公共變量KitchenCellar,你將被設置爲

+0

他們不公開。 – problemofficer 2010-11-14 06:12:47

+3

@problemofficer:他回答了你的問題:「有沒有辦法直接做到這一點?」。是的,您可以直接通過使子對象可訪問來實現。你可以通過聲明朋友類,寫一個返回指針或引用的函數等方法來公開它們。 – 2010-11-14 06:37:47

+0

@problemofficer:由於貨架和爐子不是公共的,你必須做更多的設置連接。您需要建立2個信號的連接,其中一個來自家中的信號,另一個來自廚房的信號,另一個來自廚房的信號,以及爐子中的一個插槽。貨架和地窖也一樣。一個例子... House' connect(this,SIGNAL(recievedSignalFromCellar()),kitchen,SIGNAL(send2Stove()));'Kitchen' connect(this,SIGNAL(send2Stove()),shelf,SLOT(passedThroughKitchen()) );' – g19fanatic 2010-11-14 21:48:05

1

你不能在沒有QObject的類上使用信號/插槽,所以不,你的例子不會工作。

可以規避封裝,如果你initilaize與他們的父對象的子對象,所以你可以做的技巧,比如:connect(this->shelf, SIGNAL(signalHere()), kitchen->children()[0], SLOT(aStoveSlot()))。然而,這隻有在廚房的第一個孩子真的是火爐的時候纔會起作用......因此,這是明顯的依賴關係,您應該通過公開爐子或者添加爐竈配件方法來使其可見。

+0

這僅僅是一個例子。實際的類將繼承QObject。感謝骯髒的伎倆。 – problemofficer 2010-12-18 13:52:29

+0

不過,我認爲這個說明很重要。 – 2011-06-15 03:12:27