2014-10-22 83 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