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

时间:2015-01-30 07:16:52

标签: c++ qt

我们假设我们有三个班级ABCB拥有A的私有实例,C拥有B的实例(即C - > B - > { {1}})。 A需要收到来自C的{​​{1}}信号,但由于update()是私有的,我们可以:


使用A中的访问者方法允许访问A的{​​{1}}信号。例如,

B中的

A

或者,我们可以将update()中的C connect(B.getA(), SIGNAL(update()), this, SLOT(doUpdate())); 信号转发给A。例如,

update()中的

B

C

B

或者,我完全遗漏了一些其他选择;不确定。

基本上,这两个选项有什么区别?两种方式都没有打破封装,但是有转发信号会引入延迟吗?文档说第二个信号是在收到第一个信号后立即发送的,因此看起来不会有太大差别,但我很好奇是否有一个'右'这样做的方法。


哦,我意识到"隐藏"标题中的内容并不准确,但我无法想到一种更好的方式来表达它而不会过于冗长。

2 个答案:

答案 0 :(得分:2)

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

关于封装,如果不了解更多有关ABC的信息,很难说清楚... C希望收到有关发生的事情的通知B隐藏的内容听起来很奇怪......可能B应该来自A,或者至少从逻辑的角度重新发布该信号?

答案 1 :(得分:1)

我个人会将A的信号连接到B中的(重复)update信号。这样你就可以隐藏B的实现,并且可以在以后改变内部机制。它不是一个过于复杂的形式,但C中的connect(B.getA(), SIGNAL(update()), this, SLOT(doStuff()))版本闻起来有点Law of Demeter