QDialog之模態與非模態

2021-09-10 10:18:34 字數 2687 閱讀 2410

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

(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

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...