天天看點

QT對話框中show和exec的差別

出處:http://www.cnblogs.com/hujianhua/archive/2012/06/24/2559761.html

QDialog的顯示有兩個函數show()和exec()。他們的差別在參考文檔上的解釋如下:

show():

顯示一個非模式對話框。控制權即刻傳回給調用函數。

彈出視窗是否模式對話框,取決于modal屬性的值。

(原文:Shows the dialog as a modeless dialog. Control returns immediately to the calling code. 

The dialog will be modal or modeless according to the value of the modal property. )

exec():

顯示一個模式對話框,并且鎖住程式直到使用者關閉該對話框為止。函數傳回一個DialogCode結果。

在對話框彈出期間,使用者不可以切換同程式下的其它視窗,直到該對話框被關閉。

(原文:Shows the dialog as a modal dialog, blocking until the user closes it. The function returns a DialogCode result. 

Users cannot interact with any other window in the same application until they close the dialog. )

先簡單說一下我對模式和非模式對話框的一點點了解:

模式對話框,就是在彈出視窗的時候,整個程式就被鎖定了,處于等待狀态,直到對話框被關閉。這時往往是需要對話框的傳回值進行下面的操作。如:确認視窗(選擇“是”或“否”)。

非模式對話框,在調用彈出視窗之後,調用即刻傳回,繼續下面的操作。這裡隻是一個調用指令的發出,不等待也不做任何處理。如:查找框。

從字面上看,show()即可以顯示非模式也可以顯示模式對話框(設定modal值)。當modal=true的時候是否跟exec()就一樣了呢?

經過測試,還是有差別的。

使用show(),雖然在對話框彈出的時候,程式的其它操作(按鈕、視窗切換等)都失效了;但是程式仍然在調用對話框之後,馬上傳回繼續執行後面的代碼。

這樣,你就不會得到視窗的傳回值。以這個來看,show()隻能算是“半模式”。

而使用exec(),在調用之後,程式就被鎖定在原地。等待視窗的關閉。