QT 視窗的顯示與模態視窗

2021-09-27 01:54:28 字數 2272 閱讀 9555

我們知道,在qt裡,只要建立乙個視窗的類,再呼叫qwidget基類的.show()

方法就可以使乙個視窗顯示。

以qwidget類來作說明

/* mywidget.cpp  主類的實現*/

#include "mywidget.h"

#include "ui_mywidget.h"

#include#include#includemywidget::mywidget(qwidget *parent) :

qwidget(parent),

ui(new ui::mywidget)

mywidget::~mywidget()

執行一下看效果:

可以看到,主視窗之前,有乙個小視窗一閃而過,最後只剩下主視窗還在顯示。

很明顯,qdialog物件只存在了一瞬間,讓我們分析一下原因。

/*main.cpp 程式執行入口*/

#include "mywidget.h"

原來在程式的主入口中,是先例項化主視窗,再進行主視窗的顯示。這樣就導致,要等到主視窗類的建構函式執行完畢後,才能顯示主視窗。

而qwidget定義在主視窗的建構函式中,物件的例項化過程一完成,建構函式的棧區就消失了,qwidget也就跟著沒了。

那麼就有兩種解決方案:

1.為qwidget 加乙個.exec()迴圈方法  (但這樣會使得建構函式一直進行,只有關閉了qdialog 後才能完成構造,從而顯示主視窗。)

2.動態構造物件,使用new關鍵字分配動態記憶體,使得建構函式執行完畢後,物件所在空間仍然存在(注意,如果設定了qdialog的父視窗,就不必手動銷毀動態分配的空間了,在關閉父視窗的同時,子視窗的記憶體空間也會被自動銷毀)(推薦)

/*mywidget.cpp 最終實現*/

#include "mywidget.h"

#include "ui_mywidget.h"

#include#include#includemywidget::mywidget(qwidget *parent) :

qwidget(parent),

ui(new ui::mywidget)

mywidget::~mywidget()

這樣就實現了子視窗和父視窗同時存在了。

我們實現了子視窗和父視窗同時存在後,就會發現好像這個子視窗跟其他程式見到的不太一樣

父視窗竟然在子視窗沒關的情況下可以自由移動和變化!!

這就要引入模態(modality)的概念

根據qt的幫助文件,其介紹說模態(modality)是視窗的乙個屬性,具有模態的視窗可以組織其它的視窗接收事件訊號,通俗點講就是乙個視窗若是模態,就不允許使用者在其出現的情況下去操控別的視窗。當其被關閉後,才能進行其他視窗的操作。

如何設定模態呢?通過qwidget::setmodal(bool) 函式來設定

引數為true(1)代表設定為模態視窗,引數為false(0)代表設定為非模態視窗(預設)

/*mywdiget.cpp 模態的設定*/

#include "mywidget.h"

#include "ui_mywidget.h"

#include#include#includemywidget::mywidget(qwidget *parent) :

qwidget(parent),

ui(new ui::mywidget)

mywidget::~mywidget()

執行效果:

如圖,在不關閉子視窗的情況下是無法操作父視窗的。

Qt基礎 模態與非模態視窗

設定置頂非模態視窗 在qt中,qdialog是所有對話方塊視窗類的基類,不只是對話方塊有模態與非模態區分,qwidget和qmainwindow視窗也可以設為模態,因此文章不稱模態 非模態對話方塊,而叫做模態 非模態視窗。模態 modal 視窗 視窗彈出後,沒關閉之前,不可以對同一應用程式的其他視窗...

關於Qt模態視窗的設定

模態視窗會阻止其他視窗的輸入型事件 如獲取焦點 但是模態視窗的子視窗不會被限制。設定 setattribute qt wa showmodal,true 的方式qt4.5已廢棄,略過 目前,qt中設定視窗模態是通過 qwidget 的setwindowmodality 函式 引數有三種列舉 注意,q...

C 模態視窗和非模態視窗

c 視窗對話方塊一般分為兩種型別 模態型別 modal 與非模態型別 modeless 所謂模態對話方塊,就是指除非採取有效的關閉手段,使用者的滑鼠焦點或者輸入游標將一直停留在其上的對話方塊。非模態對話方塊則不會強制此種特性,使用者可以在當前對話方塊以及其他視窗間進行切換下例中的form1使用模態方...