在exec()之前将quit()发布到QEventLoop

时间:2016-03-02 12:10:09

标签: c++ qt qt-signals

我创建了一个QEventLoop对象并在启动之前尝试发出quit()消息,所以我打算进入并退出循环:

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

但是线程在循环中循环并且永不退出...
如何实现预期的行为?

1 个答案:

答案 0 :(得分:3)

这种孤立似乎并没有多大意义,但为了回答您的问题,您可以与Qt::QueuedConnection联系,然后在运行时收到quit来电事件循环然后循环将正确退出。

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

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