出處: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(),在調用之後,程式就被鎖定在原地。等待視窗的關閉。