说明
通过创建多个类建立parent-child关系,对信号槽自动绑定函数QMetaObject::connectSlotsByName()进行了测试,现将测试结果公布如下。
测试结果
创建以下四个类对象
测试结果: QMetaObject::connectSlotsByName(A)调用会对对象A中的所有槽进行尝试绑定,信号源为this(包括)以下的所有的直接child和间接child。
问题解析
- 绑定是否针对A之下的parent-child体系中的所有槽?答:不是,仅针对对象A中的槽。
- 绑定是否针对A之下的parent-child体系中的所有信号?答:是,且包括自定义信号。
- B中的槽有无可能被C中的信号连接?答:没有可能,参考1。
- B中的槽有无可能被D中的信号连接?答:没有可能,参考1。
- D中的信号可以连接到A中的槽吗?答:可以。
- ObjectName()相同、信号名称及形参也相同的信号,是否会全部绑定在符合条件的槽上?答:不会,仅绑定这些信号所属的对象中第一个被构造的。
- D对象构造在A中或B中或其它位置,影响绑定吗?答:不影响。
- 两次重复调用QMetaObject::connectSlotsByName(A)会怎样?答:会出现发送一次信号,A中被连接的槽被连续调用两次的情况。
- 如果通过函数自动将D中的信号绑定到了A中,之后对B调用setParent(0),D与A的信号槽连接是否会断开?答:不会。parent-child关系仅对绑定之时有关,对于绑定之后只要信号和槽所属的对象仍存在,连接就不会断开。
- 如果通过函数自动将D中的信号绑定到了A中,之后delete B,D与A的信号槽连接是否会断开?答:会。由Qt对象释放规则可知,D是B的child,D会随B一起被delete掉。