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()函數
- 該函數忽略對話框的modal屬性,總是將對話框作爲模態顯示;
- 該函數本身不會改變窗口的WindowModality、WA_ShowModal和modal值;
- 當以該函數顯示對話框時,總是將對話框作爲模態顯示,並且阻塞直到用戶主動關閉此對話框,並返回DialogCode result;
- 當以該函數顯示對話框時,如果該對話框的WindowModality屬性爲ApplicationModal,在用戶關閉此對話框之前,在此相同的應用程序的其它所有窗口都會被阻塞;如果WindowModality屬性爲WindowModal,在用戶關閉此對話框之前,與該窗口的父窗口有關聯的所有窗口(包括父窗口本身),即該窗口的所有祖先窗口,都會被阻塞;如果WindowModality屬性爲NonModal,默認情況與WindowModality屬性爲ApplicationModal一樣。
QDialog的show()函數
- 該函數本身不會阻塞,調用後立即返回;
- 當窗口是模態狀態,並且通過show()顯示,此時窗口對象不能爲局部變量(指針類型除外),否則show()調用後立即返回,該對象的作用域超過後,對象就會被銷燬,窗口就是一閃而過的效果;
- 當窗口以模態狀態顯示,並且WindowModality值爲WindowModal時,該窗口的父窗口不能爲NULL,否則窗口雖然是模態,但因爲父窗口是NULL且阻塞方式爲WindowModality,窗口依然不會阻塞任何窗口,效果就如同非模態一樣;
- 當窗口以非模態狀態顯示時,
4.1. 該窗口必須是通過show()顯示,不能通過exec()顯示。因爲此時WindowModality值爲NoModal,如果通過exec()調用顯示,則其效果與WindowModality值爲ApplicationModal的值一樣,該窗口會阻塞該應用程序的其它所有窗口;
4.2. 該窗口對象不能爲局部變量(指針類型除外),否則show()調用後立即返回,該對象的作用域超過後,對象就會被銷燬,窗口就是一閃而過的效果,不能達到非模態對話框實際的效果。