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

标签 c++ qt

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


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

C 中:

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

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

B 中:

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

C 中:

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

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

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


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

最佳答案

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

关于封装,如果不了解更多关于 ABC 的知识,就很难说清楚... C 想要通知 B 的隐藏内脏中发生的事情听起来很奇怪......可能是 B 应该派生自 A 或者至少从逻辑角度重新发布该信号?

关于c++ - 尝试在 Qt 中连接隐藏信号的两种方式之间做出决定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28231031/

相关文章:

c++ - 内存堆损坏 + GFlags 工具但不是结果

c++ - 获取 "gets"其他获取函数的函数

c++ - 编写可测试代码 - lambda 函数和 unique_ptr 中的 basic_istream 工厂

qt - 你如何让 QtCreator 在左侧的 src 树中同时显示 cpp 和头文件?

javascript - QML 报告 ReferenceError : XYZ is not defined on C++ object added to context

python - 调用嵌入式Qt的.dll函数

c# - 托管代码应该向非托管代码返回错误还是抛出异常?

c++ - 模板错误 : no matching function call

c++ - QTest执行两次测试用例

macos - Qt5 "symbol(s) not found for architecture x86_64"