直接连接和事件循环

时间:2014-12-12 15:47:37

标签: qt

我已阅读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()

1 个答案:

答案 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() - 就像函数调用那样:)