QDialog之模態與非模態

QtDialog在創建時默認爲非模態(modal屬性爲false),可以通過setModal()函數設置對話框爲模態還是非模態。

窗口是否是模態和非模態和窗口(包括QDialog和QWidget等)的exec()和show()等函數無直接關係,只和窗口的阻塞方式有關。
setWindowModality()函數是用來設置QWidget運行時的窗口阻塞方式,可以實現窗口是模態還是非模態。

參數類型 含義
Qt::NonModal 窗口不是模態,並且不阻塞其它任何窗口
Qt::WindowModal 窗口是模態對於單個的窗口層次,並且阻塞其所有祖先窗口(包括其父窗口、父窗口的兄弟窗口以及父窗口和父窗口的兄弟窗口的祖先窗口)
Qt::ApplicationModal 窗口是模態對於這個應用程序,並且阻塞應用程序內的其它所有窗口

窗口初始化時,與窗口模態和非模態狀態有關的三個變量的默認值:

變量 默認值
isModal false
WA_ShowModal false
WindowModality NonModal

isModal()函數返回的值是窗口的window_modality值。
 
將窗口設置爲模態:

setModal(true); // 對話框特有
setAttribute(Qt::WA_ShowModal, true); // 設置WA_ShowModal屬性
setWindowModality(Qt::ApplicationModal); // 設置阻塞方式

將窗口設置爲非模態:

setModal(false); // 對話框特有
setAttribute(Qt::WA_ShowModal, false); // 設置WA_ShowModal屬性
setWindowModality(Qt::NonMoal); // 設置阻塞方式

對話框的setModal(bool)、setWindowModality(Qt::WindowModality)和setAttribute(Qt::WA_ShowModal, bool)是相互影響的,調用其中任一函數,其它的值都會改變。

setModal() false
isModal false
WA_ShowModal false
WindowModality NonModal
setModal() true
isModal true
WA_ShowModal true
WindowModality ApplicationModal
setAttribute(Qt::WA_ShowModal, bool) false
isModal false
WA_ShowModal false
WindowModality NonModal
setAttribute(Qt::WA_ShowModal, bool) true
isModal true
WA_ShowModal true
WindowModality ApplicationModal
setWindowModality() NonModal
isModal false
WA_ShowModal false
WindowModality NonModal
setWindowModality() WindowModal
isModal true
WA_ShowModal true
WindowModality WindowModal
setWindowModality() ApplicationModal
isModal true
WA_ShowModal true
WindowModality ApplicationModal

注:
當調用setWindowModality(Qt::WindowModality)設置WindowModality爲ApplicationModal或WindowModal後,再次調用setModal(true)或setAttribute(Qt::WA_Show_Modal,true)時,不會影響isModal()、WA_ShowModal和WindowModality的值,即isModal()和WA_ShowModal的值仍爲true,而WindowModality的值仍爲ApplicationModal或WindowModal。

QDialog的exec()函數

  1. 該函數忽略對話框的modal屬性,總是將對話框作爲模態顯示;
  2. 該函數本身不會改變窗口的WindowModality、WA_ShowModal和modal值;
  3. 當以該函數顯示對話框時,總是將對話框作爲模態顯示,並且阻塞直到用戶主動關閉此對話框,並返回DialogCode result;
  4. 當以該函數顯示對話框時,如果該對話框的WindowModality屬性爲ApplicationModal,在用戶關閉此對話框之前,在此相同的應用程序的其它所有窗口都會被阻塞;如果WindowModality屬性爲WindowModal,在用戶關閉此對話框之前,與該窗口的父窗口有關聯的所有窗口(包括父窗口本身),即該窗口的所有祖先窗口,都會被阻塞;如果WindowModality屬性爲NonModal,默認情況與WindowModality屬性爲ApplicationModal一樣。

QDialog的show()函數

  1. 該函數本身不會阻塞,調用後立即返回;
  2. 當窗口是模態狀態,並且通過show()顯示,此時窗口對象不能爲局部變量(指針類型除外),否則show()調用後立即返回,該對象的作用域超過後,對象就會被銷燬,窗口就是一閃而過的效果;
  3. 當窗口以模態狀態顯示,並且WindowModality值爲WindowModal時,該窗口的父窗口不能爲NULL,否則窗口雖然是模態,但因爲父窗口是NULL且阻塞方式爲WindowModality,窗口依然不會阻塞任何窗口,效果就如同非模態一樣;
  4. 當窗口以非模態狀態顯示時,
    4.1. 該窗口必須是通過show()顯示,不能通過exec()顯示。因爲此時WindowModality值爲NoModal,如果通過exec()調用顯示,則其效果與WindowModality值爲ApplicationModal的值一樣,該窗口會阻塞該應用程序的其它所有窗口;
    4.2. 該窗口對象不能爲局部變量(指針類型除外),否則show()調用後立即返回,該對象的作用域超過後,對象就會被銷燬,窗口就是一閃而過的效果,不能達到非模態對話框實際的效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章