我已阅读Qt的文档并提出以下问题: 如果我有:
class_A::on_button_click(){
...do some things...//no signal emit this part
emit signal_A();
}
class_B::on_signal_received(){
...do some things...//no signal emit this part
}
...
connect(class_A_object,SIGNAL(signal_A()),class_B_object,on_signal_received);
这里的所有内容都在主线程中, 现在当我点击按钮并触发第一个功能时,
程序将从
的第一行执行class_A::on_button_click()
直到最后一行
class_B::on_signal_received()
并且在此过程中主线程中没有任何其他内容可以被执行,这是正确的吗?(" ...做一些事情......"部分不发出任何信号)
换句话说,控件何时返回事件循环? 完成后
class_A::on_button_click()
或
class_B::on_signal_received()
答案 0 :(得分:1)
当您的信号和插槽位于同一个线程中时(如user3183610所述),您的信号将是直接连接(相同线程的默认值)。这有效地与函数调用类似地运行。信号没有排队,而是信号连接的插槽立即执行 - 因此您可以将其视为对插槽的直接函数调用。
但是,您可以通过在连接调用结束时使用Qt :: QueuedConnection可选参数来更改此行为:
connect(class_A_object,SIGNAL(signal_A()),class_B_object,on_signal_received, Qt::QueuedConnection);
这将强制使用队列,您的信号将在事件循环中排队,然后其他待处理信号将按顺序执行(这通常比DirectConnection更理想,因为您可以更轻松地保证事件的顺序) 。由于这个原因,我倾向于使用排队连接(虽然我认为直接效率稍高一些)。
因此,对于您的代码,在on_button_click()之后才会返回事件循环。在on_button_click()期间,你发出了diret信号signal_x()并且立即调用on_signal_received()(绕过事件循环),当它完成时它返回on_button_click() - 就像函数调用那样:)