2010-11-14 77 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