我在与主线程不同的线程中创建了Qt树控件(及其节点)。在主线程中,我想显示所单击节点的上下文菜单,因此我将菜单中的操作与主线程中的相应插槽连接起来。 connect函数返回true,但从不执行slot。如果我在连接函数中明确说这是Qt :: DirectConnection,那么一切正常。这是为什么?
我在主线程中创建了我的树,一切都运行正常,而不必说这是Qt :: DirectConnection。
答案 0 :(得分:4)
请参阅文档here。
如果信号是从与接收器插槽相同的线程发送的,则默认连接类型Qt :: AutoConnection与Qt :: DirectConnection相同,否则行为与Qt :: QueuedConnection相同。
如果在主线程中创建窗口小部件,则基本上会获得与显式指定Qt :: DirectConnection时相同的行为。
Qt :: QueuedConnection的行为是在线程事件循环重新获得控制权时调用插槽。
要解决您的问题,请确保在每个可能正在接收信号的线程中都有一个事件循环,除非您手动指定Qt :: DirectConnection(我认为这意味着将从与该线程相同的线程调用该槽)信号发射器 - 基本上是正常函数调用的等效物。)