1. 程式人生 > >Qt::ApplicationModal不起作用的原因

Qt::ApplicationModal不起作用的原因

設定QWidget的Qt::WindowModality屬性為Qt::WindowModal和Qt::ApplicationModal,發現窗體仍然不會模態,最後問題解決掉了,是因為我的QWidget有Parent,如果構造時設定Parent為NULL的話,就可以了。程式碼如下:

ver_frame = new versionFrame();
ver_frame->setWindowFlags(Qt::FramelessWindowHint);//去除窗體邊框
ver_frame->setWindowModality(Qt::ApplicationModal);//設定窗體模態,要求該窗體沒有父類,否則無效
ver_frame->setGeometry(178, 178, 284, 132);
ver_frame->show()

對話方塊的生命週期

QDialog dialog(this);

dialog.show();

這樣在一個函式中定義的物件是建立在棧上的,函式執行完畢,dialog的顯示就結束,顯示的效果可能就是這個視窗一閃而逝。

QDialog *dialog = new QDialog(this);

dialog->show();

這樣定義了一個指向QDialog物件的指標,用new開闢了新的記憶體空間,函式執行完畢,dialog還能夠顯示。此處我們可能會問,這樣不會發生記憶體洩漏嗎?

情況是這樣,這裡為dialog指明瞭父視窗,當父視窗關閉的時候,dialog隨之被銷燬。如果對記憶體佔用有嚴格限制的話,當我們將主視窗作為 parent 時,主視窗不關閉,dialog就不會被銷燬,所以會一直佔用記憶體。在這種情景下,我們可以呼叫deleteLater()

函式,或者是設定 dialog 的 WindowAttribute

QDialog *dialog = new QDialog; 

 dialog->setAttribute(Qt::WA_DeleteOnClose); // 或者 dialog->deleteLater(); 

 dialog->setWindowTitle(tr("Hello, dialog!")); 

 dialog->show();

對話方塊模態的設定

呼叫exec()可以設定模態,如

QDialog *dialog = new QDialog(this); // 將this作為父窗

dialog->exec(); //只顯示dialog,不顯示父窗,只有當子視窗關閉,父窗口才顯現

採用show顯示的視窗,用setModal()同樣可以設定模態

QDialog *dialog = new QDialog(this);

dialog->setModal(true);

dialog->show(); //子視窗顯示的同時,父視窗也顯示出來,只不過子視窗未關閉情況下無法對父視窗操作

與setModal()相似的一個函式setWindowModality()可以設定阻塞哪些視窗的顯示,它有一個引數可以是Qt::NonModal(非模態)、Qt::WindowModal(模態,阻塞父視窗、祖先視窗及子視窗)、Qt::ApplicationModal(模態,阻塞整個應用程式所有視窗),預設狀態下為最後一個。