Post 在 exec() 之前 quit() 到 QEventLoop

Post quit() to QEventLoop before exec()

我创建了一个 QEventLoop 对象并尝试在启动它之前放置 quit() 消息,所以我的目的是进入和退出一个循环:

QEventLoop loop;
loop.connect(this, SIGNAL(sig()), SLOT(quit()));
emit sig();
loop.exec(); // can't get past this point

但是线程在循环中循环并且永不退出...
我怎样才能实现预期的行为?

单独来看这似乎没有多大意义,但为了回答您的问题,您可以连接 Qt::QueuedConnection,然后 quit 呼叫将在 运行事件循环然后循环会正确退出。

这是有效的,因为插槽是按照 connect 调用的顺序执行的,所以另一个恰好连接到 sig() 的插槽可以做任何它想做的事情,甚至可以启动自己的事件循环。但是,最后一个连接是你的,它对 quit 的排队调用将最后发生,在对 quit 的排队调用和对 loop.exec 的调用之间没有其他事件循环操作。

请记住,本地 QEventLoops 就像调用 QApplication::processEvents 一样非常危险。如果您可以更改代码,请尝试设置一个状态机来执行异步工作。