2014-10-22 1945 views
0

我是新来的QtQMessageBox会阻塞Qt中整个主线程的运行吗?

我的情况是:由于某些原因,我不得不发出从主线程心跳信号,在同一时间,我想用来创建一个QMessageBox提示窗口:

reply = QMessageBox::question(this, tr("Sure want to quit?"), tr("Sure quit?"), QMessageBox::Yes|QMessageBox::No); 

我只是想让这个消息框阻止来自其他窗口的用户输入,但我不想阻止心跳信号。 我该怎么做?或者这是默认在Qt中完成的?

回答

2

QMessageBox ::问题内部执行事件循环。所以一切都在继续。你不需要担心这一点。

但是,您可以使用这些功能获得奇怪的效果。例如。如果你的心跳可以打开一个对话框,即使另一个对话框已经打开,该对话框也会打开。 也想象你有一个TCP/IP堆栈运行。这个堆栈可以做的所有事情都会继续发生......无论QMessageBox :: question()当前是否被执行......就像在某个函数的中间一样。

这就是为什么我们在我们公司有一项政策,禁止在我们的应用程序中使用QMessageBox :: question()(以及类似的)和在对话框上调用exec()。我们正在堆上创建模态对话框,并使用它们的信号。

+0

在我的情况下,将“调用对话框上的exec()”停止心跳信号?你能举一个简单的例子来说明你的公司是如何完成的,非常感谢。 – Nyaruko 2014-10-22 08:10:45

+2

@Nyaruko不,'QDialog :: exec'做同样的事情。它创建一个本地事件循环。本地事件循环可能会很糟糕。你可以阅读[这篇文章](https://blogs.kde.org/2009/03/26/how-crash-almost-every-qtkde-application-and-how-fix-it-0)来找出原因。 – thuga 2014-10-22 08:18:42

+0

最值得注意的是在本地事件循环中没有做的是deleteLater执行。正是为了防止'this'得到'delete'd崩溃。 (如果你实际上'删除'父母,但是如果你使用'deleteLater',它将不会帮助你。 – 2014-10-22 09:09:56