尝试在Qt中连接隐藏信号的两种方式之间做出决定

Trying to decide between two ways of connecting a hidden signal in Qt

本文关键字:方式 两种 之间 决定 信号 Qt 隐藏 连接      更新时间:2023-10-16

假设我们有三个类,ABCB持有A的私有实例,C持有B的实例(即 C -> B -> A )。 C需要接收来自Aupdate()信号,但由于A是私有的,我们可以:


B中使用访问器方法来允许访问Aupdate()信号。例如

C

 connect(B.getA(), SIGNAL(update()), this, SLOT(doUpdate()));

或者,我们可以将Aupdate()信号转发给B C。例如

B

connect(A, SIGNAL(update()), this, SIGNAL(update()));

C

connect(B, SIGNAL(update()), this, SLOT(doUpdate())); 

或者,我完全缺少的其他一些选择;不确定。

基本上,这两个选项之间有什么区别?这两种方式都不会破坏封装,但是转发信号会引入延迟吗?文档说第二个信号在收到第一个信号后立即发送,所以看起来不会有太大区别,但我很好奇是否有"正确"的方法可以做到这一点。


哦,我意识到标题中的"隐藏"并不准确,但我想不出更好的措辞方式而不会太罗嗦。

在同一线程中发出的信号只是一个调用(除非您明确要求使用队列),因此从性能的角度来看,成本可以忽略不计,除非您每秒创建大量(数百万)个信号(在这种情况下,使用信号可能是一个坏主意)。如果与GUI相关的机器需要这样做,那么成本很可能无关紧要,因为在GUI中绘制单个字符的成本要高得多。

关于封装,如果不了解ABC,就很难分辨......事实上,C想要被告知B隐藏的内脏中发生的事情听起来很奇怪......也许B应该从逻辑角度从A或至少重新发布该信号?

我个人会将 A 的信号连接到 B 中的(重复)update信号。这样,您就可以对 C 隐藏 B 的实现,并且可以稍后更改内部机制。这不是一个过于复杂的形式,但 C 语言的connect(B.getA(), SIGNAL(update()), this, SLOT(doStuff()))版本闻起来有点得墨忒耳定律。