qtdialog在建立時預設為非模態(modal屬性為false),可以通過setmodal()函式設定對話方塊為模態還是非模態。
視窗是否是模態和非模態和視窗(包括qdialog和qwidget等)的exec()和show()等函式無直接關係,只和視窗的阻塞方式有關。
setwindowmodality()函式是用來設定qwidget執行時的視窗阻塞方式,可以實現視窗是模態還是非模態。
引數型別
含義qt::nonmodal
視窗不是模態,並且不阻塞其它任何視窗
qt::windowmodal
視窗是模態對於單個的視窗層次,並且阻塞其所有祖先視窗(包括其父視窗、父視窗的兄弟視窗以及父視窗和父視窗的兄弟視窗的祖先視窗)
視窗是模態對於這個應用程式,並且阻塞應用程式內的其它所有視窗
視窗初始化時,與視窗模態和非模態狀態有關的三個變數的預設值:變數預設值
ismodal
false
wa_showmodal
false
windowmodality
nonmodal
ismodal()函式返回的值是視窗的window_modality值。
將視窗設定為模態:
將視窗設定為非模態:setmodal
(true);
// 對話方塊特有
setattribute
(qt:
:wa_showmodal,
true);
// 設定wa_showmodal屬性
setwindowmodality
(qt:
;// 設定阻塞方式
對話方塊的setmodal(bool)、setwindowmodality(qt::windowmodality)和setattribute(qt::wa_showmodal, bool)是相互影響的,呼叫其中任一函式,其它的值都會改變。setmodal
(false);
// 對話方塊特有
setattribute
(qt:
:wa_showmodal,
false);
// 設定wa_showmodal屬性
setwindowmodality
(qt:
:nonmoal)
;// 設定阻塞方式
setmodal()
false
ismodal
false
wa_showmodal
false
windowmodality
nonmodal
setmodal()
true
ismodal
true
wa_showmodal
true
windowmodality
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
setwindowmodality()
nonmodal
ismodal
false
wa_showmodal
false
windowmodality
nonmodal
setwindowmodality()
windowmodal
ismodal
true
wa_showmodal
true
windowmodality
windowmodal
setwindowmodality()
ismodal
true
wa_showmodal
true
windowmodality
qdialog的exec()函式該函式忽略對話方塊的modal屬性,總是將對話方塊作為模態顯示;
該函式本身不會改變視窗的windowmodality、wa_showmodal和modal值;
當以該函式顯示對話方塊時,總是將對話方塊作為模態顯示,並且阻塞直到使用者主動關閉此對話方塊,並返回dialogcode result;
qdialog的show()函式該函式本身不會阻塞,呼叫後立即返回;
當視窗是模態狀態,並且通過show()顯示,此時視窗物件不能為區域性變數(指標型別除外),否則show()呼叫後立即返回,該物件的作用域超過後,物件就會被銷毀,視窗就是一閃而過的效果;
當視窗以模態狀態顯示,並且windowmodality值為windowmodal時,該視窗的父視窗不能為null,否則視窗雖然是模態,但因為父視窗是null且阻塞方式為windowmodality,視窗依然不會阻塞任何視窗,效果就如同非模態一樣;
「模態」與「非模態」
模態與非模態,主要就是體現在是否 阻塞 應用程式上。模態 在該視窗彈出後,會阻塞應用程式的視窗,使其不可操作 非模態 不會阻塞應用程式的視窗,兩者可獨立操作。模,就是模子,模子是不可更改的,因此模態情況下,除了它本身之外的內容不可操作。兩個的使用根據實際情況而定,轉換的方式是通過 setmodal ...
Qt QMessageBox 之模態非模態
qt 的訊息框用起來比新建對話方塊方便一些。有兩種呼叫方法,靜態的和動態的。一 靜態呼叫 例子 qmessagebox warning qwidget parent,const qstring title,const qstring text,standardbuttons buttons ok,s...
模態 非模態
正常視窗似乎是window.open或hreftarget彈出的普通視窗,而模式視窗是類似alert那種必須關閉才能響應其他事件的視窗,或者是可以繼承父視窗的生存 父視窗關閉相應的模式視窗也關閉 以下就是2個,乙個必須響應,乙個不許要 showmodaldialog ie 4 支援 showmode...