假设我们有三个类,A
、B
和 C
。 B
持有 A
的私有(private)实例,而 C
持有 B
的实例(即 C
-> B
-> A
)。 C
需要从 A
接收一个 update()
信号,但是由于 A
是私有(private)的,我们可以:
在 B
中使用访问器方法以允许访问 A
的 update()
信号。例如,
在 C
中:
connect(B.getA(), SIGNAL(update()), this, SLOT(doUpdate()));
或者,我们可以将 B
中的 A
的 update()
信号转发给 C
。例如,
在 B
中:
connect(A, SIGNAL(update()), this, SIGNAL(update()));
在 C
中:
connect(B, SIGNAL(update()), this, SLOT(doUpdate()));
或者,我完全缺少的一些其他选项;不确定。
基本上,这两个选项之间有什么区别?这两种方式都不会破坏封装,但是转发信号是否会引入延迟?文件说第二个信号是在收到第一个信号后立即发送的,所以看起来差别不大,但我很好奇是否有“正确”的方法来做到这一点。
哦,我意识到标题中的“隐藏”并不准确,但我想不出更好的措辞方式又不会太罗嗦。
最佳答案
在同一个线程中发出的信号只是一个调用(除非您明确要求使用队列),因此从性能的角度来看,成本可以忽略不计,除非您正在创建大量(数百万)个信号每秒(在这种情况下,无论如何使用信号可能不是一个好主意)。如果与 GUI 相关的机器需要这样做,那么成本很可能无关紧要,因为在 GUI 中绘制单个字符的成本要高得多。
关于封装,如果不了解更多关于 A
、B
或 C
的知识,就很难说清楚... C
想要通知 B
的隐藏内脏中发生的事情听起来很奇怪......可能是 B
应该派生自 A
或者至少从逻辑角度重新发布该信号?
关于c++ - 尝试在 Qt 中连接隐藏信号的两种方式之间做出决定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28231031/