尝试在Qt中连接隐藏信号的两种方式之间做出决定
Trying to decide between two ways of connecting a hidden signal in Qt
假设我们有三个类,A
、B
和C
。 B
持有A
的私有实例,C
持有B
的实例(即 C
-> B
-> A
)。 C
需要接收来自A
的update()
信号,但由于A
是私有的,我们可以:
在B
中使用访问器方法来允许访问A
的update()
信号。例如
在C
:
connect(B.getA(), SIGNAL(update()), this, SLOT(doUpdate()));
或者,我们可以将A
的update()
信号转发给B
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
或至少重新发布该信号?
我个人会将 A 的信号连接到 B 中的(重复)update
信号。这样,您就可以对 C 隐藏 B 的实现,并且可以稍后更改内部机制。这不是一个过于复杂的形式,但 C 语言的connect(B.getA(), SIGNAL(update()), this, SLOT(doStuff()))
版本闻起来有点得墨忒耳定律。
- 在C++中将函数压缩为两种方式
- 为什么两种不同的对象初始化方式给出不同的输出
- C++:这两种将数字写入矩阵的方式之间是否存在显着的速度差异?
- 将函数作为参数传递的两种方式之间的区别
- 初始化结构的两种方式
- 在两种情况下,铸造的工作方式不同
- 这两种方式有什么区别吗?
- 由于您可以在C 中以两种方式声明复制构造函数,这是正确的方式
- 定义构造函数的两种不同方式
- 尝试在Qt中连接隐藏信号的两种方式之间做出决定
- C++:如何使用CIN和File两种方式获取输入
- 在C++中定义虚拟继承的两种不同方式
- 为什么这两种访问C++映射对部分的方式不同
- openssl sha256两种计算方式的差异
- 在C++OpenMP中使用蒙特卡罗方法以两种方式计算圆周率
- 在堆栈上声明对象的两种方式之间的差异
- 使用默认构造函数的两种方式的区别
- 声明类实例的两种方式的不同之处
- 用两种不同的方式初始化指针会得到两种结果
- 在这两种包含相同标头的方式之间,编译器中是否发生了不同的事情