2015-11-09 51 views
3

我的Qt應用程序的主窗口是一個正常的QMainWindow子類。在那個窗口中,我有幾個按鈕;每個人都有其clicked信號連接自己的插槽,每個插槽創建一個不同的QDialog像這樣:是否在插槽塊中調用QDialog :: exec主事件循環?

void onButtonA_clicked() 
{ 
    MyADialog* dialog = new MyADialog(this); 
    dialog->exec(); 
    delete dialog; 
} 

我一直在閱讀這篇文章:https://wiki.qt.io/Threads_Events_QObjects#Events_and_the_event_loop和作者說

你永遠也不會阻止事件循環

這讓我擔憂; exec是一個阻塞函數,所以根據他在那裏說的(他的例子Worker::doWork,它做了很多工作,需要一些時間才能完成),我的代碼阻塞了事件循環,但我沒有注意到任何暗示這一點的事情;相反,主窗口似乎表現正常,並且在將代碼更改爲使用show()方法時沒有區別。

我是否阻止事件循環?我應該在這裏使用不同的方法嗎?

+0

據我所知,'int QDialog :: exec()'不會阻止Qt應用程序,只是父窗口,只有當對話框是窗口模式。 – Tarod

+0

@Todod嗯,它是一個阻塞函數(在QDialog關閉之前它不會返回),這就是我不確定的原因。 – szczurcio

回答

8

QDialog :: exec()阻止主事件循環,是的。它不會阻塞UI,因爲它會在exec()內部打開一個本地事件循環,該對象在對話框打開時處理事件。這可能是一個令人討厭的bug的來源:(幾乎)任何事情都可能在exec()返回之前發生,外部事件(定時器,網絡,IPC,任何)可以調用槽,導致其他對話框出現等等。考慮到大多數此類對話的模態性質,直接做出意想不到的事情通常是有限的。

需要注意可能存在的問題,並且在調用exec()時不要讓應用程序處於不一致的狀態,也不要將事情依賴於以後的事情。

或者,撥打非阻止QDialog::open()並連接到finished()信號。

+1

現在一切都很清楚,謝謝。 – szczurcio

+0

非常好的解釋!謝謝。 – Tarod

相關問題