【发布时间】:2011-05-13 13:19:40
【问题描述】:
假设我有一个 Qt 应用程序,其中有这样的东西:
connect(A, SIGNAL(a()), B, SLOT(b1()));
connect(A, SIGNAL(a()), B, SLOT(b2()));
...
void B::b1() {
A->disconnect();
}
如果发出a(),那么在从B::b1() 中的A 断开所有插槽后,是否仍会调用插槽B::b2(),因为它们都响应相同的信号?假设两个对象都生活在同一个线程中,所以我们有直接的连接。
我知道disconnect() 会断开与 A 的所有信号连接,但我不确定发出是否只是调度 b1 和 b2 插槽被调用然后调用它们,因此对连接的更改没有效果直到两个插槽(以及发射)返回。所以它可以像这样实现:
emit:
make temprorary copy of signal's slot table
foreach element in temporary slot table: call
disconnect:
clear signal's slot table
否则您可能会遇到数据结构完整性问题。
【问题讨论】:
-
作为一个模糊的相关说明,Qt 的 foreach 实际上对列表进行了临时复制操作。如果它只是对表执行 Qt foreach,它不会有数据完整性问题。
-
如果可以,那正是我的解决方案,然后将调用第二个插槽。但我认为元对象系统有点复杂。
标签: qt signals-slots