Qt信号/插槽是否遵循原生C ++的范围?
假设我有以下课程: House,Kitchen,Cellar,Stove 和 Shelf 。
class House {Kitchen kitchen, Cellar cellar;};
class Kitchen {Stove stove;};
class Cellar {Shelf shelf;};
现在我想从地窖的架子发出信号到厨房的炉子。通过将架子上的信号连接到地窖以及从厨房到炉灶的槽,然后在连接地窖和厨房的房子中,这是唯一的方法吗?或者有没有办法直接这样做?
我有一个需要与用户界面通信的类,我想知道是否需要通过中间类“代理”所有各种信号/插槽。或者这是不良设计的指标?
答案 0 :(得分:4)
您应该能够将来自Shelf实例的信号链接到Stove实例
在众议院,
connect(cellar->shelf,SIGNAL(signalHere()),kitchen->stove,SLOT(slotHere()));
只需确保shelf
和stove
中的Kitchen
和Cellar
是公共变量,您就可以设置
答案 1 :(得分:4)
您可以在House的任何方法中进行连接,因为您可以访问这两个对象。 “连接器”必须能够在编译时访问发送方和接收方,这就是它的全部内容。
答案 2 :(得分:1)
你不能在没有QObject的类上使用信号/槽,所以不,你的例子不会工作。
如果使用父对象初始化子对象,则可以绕过封装,因此您可以执行脏技巧,如:connect(this->shelf, SIGNAL(signalHere()), kitchen->children()[0], SLOT(aStoveSlot()))
。然而,这只有在厨房的第一个孩子真的是炉子的情况下才会起作用......因为这是一个明显的依赖性,你应该通过公开炉子或者通过添加炉子存取方法使其可见。