我可以访问超出范围的对象的Qt信号/插槽吗?

时间:2010-11-14 04:53:09

标签: c++ qt scope signals-slots

Qt信号/插槽是否遵循原生C ++的范围?

假设我有以下课程: House,Kitchen,Cellar,Stove Shelf

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

现在我想从地窖的架子发出信号到厨房的炉子。通过将架子上的信号连接到地窖以及从厨房到炉灶的槽,然后在连接地窖和厨房的房子中,这是唯一的方法吗?或者有没有办法直接这样做?

我有一个需要与用户界面通信的类,我想知道是否需要通过中间类“代理”所有各种信号/插槽。或者这是不良设计的指标?

3 个答案:

答案 0 :(得分:4)

您应该能够将来自Shelf实例的信号链接到Stove实例

在众议院,

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

只需确保shelfstove中的KitchenCellar是公共变量,您就可以设置

答案 1 :(得分:4)

您可以在House的任何方法中进行连接,因为您可以访问这两个对象。 “连接器”必须能够在编译时访问发送方和接收方,这就是它的全部内容。

答案 2 :(得分:1)

你不能在没有QObject的类上使用信号/槽,所以不,你的例子不会工作。

如果使用父对象初始化子对象,则可以绕过封装,因此您可以执行技巧,如:connect(this->shelf, SIGNAL(signalHere()), kitchen->children()[0], SLOT(aStoveSlot()))。然而,这只有在厨房的第一个孩子真的是炉子的情况下才会起作用......因为这是一个明显的依赖性,你应该通过公开炉子或者通过添加炉子存取方法使其可见。