關于模式和非模式,相信大家都比較熟悉,但其中有一個可能很多人都比較陌生,介于兩者之間的狀态,稱之為“半模式“。
下面以實際應用為例來介紹一下這幾種狀态。
<a href="#%e7%ae%80%e8%bf%b0">簡述</a>
<a href="#%e6%a8%a1%e5%bc%8f%e5%af%b9%e8%af%9d%e6%a1%86">模式對話框</a>
<a href="#%e6%8f%8f%e8%bf%b0">描述</a>
<a href="#%e6%95%88%e6%9e%9c">效果</a>
<a href="#%e6%ba%90%e7%a0%81">源碼</a>
<a href="#%e9%9d%9e%e6%a8%a1%e5%bc%8f%e5%af%b9%e8%af%9d%e6%a1%86">非模式對話框</a>
<a href="#%e6%8f%8f%e8%bf%b0-1">描述</a>
<a href="#%e6%95%88%e6%9e%9c-1">效果</a>
<a href="#%e6%ba%90%e7%a0%81-1">源碼</a>
<a href="#%e5%8d%8a%e6%a8%a1%e5%bc%8f%e5%af%b9%e8%af%9d%e6%a1%86">半模式對話框</a>
<a href="#%e6%8f%8f%e8%bf%b0-2">描述</a>
<a href="#%e6%95%88%e6%9e%9c-2">效果</a>
<a href="#%e6%ba%90%e7%a0%81-2">源碼</a>
<a href="#%e6%9b%b4%e5%a4%9a%e5%8f%82%e8%80%83">更多參考</a>
阻塞同一應用程式中其它可視視窗輸入的對話框。模式對話框有自己的事件循環,使用者必須完成這個對話框中的互動操作,并且關閉了它之後才能通路應用程式中的其它任何視窗。模式對話框僅阻止通路與對話相關聯的視窗,允許使用者繼續使用其它視窗中的應用程式。
顯示模态對話框最常見的方法是調用其exec()函數,當使用者關閉對話框,exec()将提供一個有用的傳回值,并且這時流程控制繼續從調用exec()的地方進行。通常情況下,要獲得對話框關閉并傳回相應的值,我們連接配接預設按鈕,例如:”确定”按鈕連接配接到accept()槽,”取消”按鈕連接配接到reject()槽。另外我們也可以連接配接done()槽,傳遞給它accepted或rejected。

主界面被阻塞,不能進行點選、拖動等任何操作。
exec()之後的代碼不會執行,直到關閉模态對話框。
和同一個程式中其它視窗操作無關的對話框。在文字進行中的查找和替換對話框通常是非模式的,允許使用者同時與應用程式的主視窗和對話框進行互動。調用show()來顯示非模式對話框,并立即将控制傳回給調用者。
如果隐藏對話框後調用show()函數,對話框将顯示在其原始位置,這是因為視窗管理器決定的窗戶位置沒有明确由程式員指定,為了保持被使用者移動的對話框位置,在closeevent()中進行處理,然後在顯示之前,将對話框移動到該位置。
主界面不會被阻塞,可以進行點選、拖動等任何操作。
show()之後的代碼會立即執行。
調用setmodal(true)或者setwindowmodality(),然後show()。有别于exec(),show() 立即傳回給控制調用者。
對于進度對話框來說,調用setmodal(true)是非常有用的,使用者必須擁有與其互動的能力,例如:取消長時間運作的操作。如果使用show()和setmodal(true)共同執行一個長時間操作,則必須定期在執行過程中調用qapplication ::processevents(),以使使用者能夠與對話框互動(可以參考qprogressdialog)。
<a href="http://blog.csdn.net/liang19890820/article/details/50533262">qwidget、qdialog、qmainwindow的異同點</a>