QT基礎(三)對話框QDialog

模態和非模態對話框。

模態對話框:當它彈出後,本應用程序其他窗口將不再接受用戶輸入,只有該對話框響應用戶輸入,在對它進 行相應操作退出後,其他窗口才能繼續與用戶交互。(比如:word中的“另存爲”)
非模態對話框:它彈出後,本程序其他窗口仍能響應用戶輸入。非模態對話框一般用來顯示提示信息等。(比如:word中的“查找與替換)

非模態對話框
創建Qt Widgets application項目,基類選擇QWidget,類名命名爲mywidget,在mywidget.cpp文件中添加代碼:

#include "mywidget.h"
#include "ui_mywidget.h"
#include<QDialog>
MyWidget::MyWidget(QWidget *parent) : QWidget(parent),  //MyWidget類的構造函數中定義一個QDialog類對象
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    QDialog *dialog =new QDialog(this);//用new相當於開闢了新的內存空間,this作用指定dialog的父窗口爲MyWidget類對象
    dialog->show();
}

MyWidget::~MyWidget()
{
    delete ui;
}

代碼解釋:QDialog *dialog 是定義了一個指向QDialog類對象的指針(也是創建對象的一種方式,但需要new開闢新的內存空間),而不是定義了一個新對象。這裏dialog指明瞭父窗口,因此不需要釋放該對象。

->是C語言和C++語言的一個運算符,叫做指向結構體成員運算符,用處是使用一個指向結構體或對象的指針訪問其內成員。
思考:深度思考->show於.show的用法區別

運行結果:
mydialog1是對話框,mywidget是窗口。
在這裏插入圖片描述
不用指針,用.exec()建立模態對話框

QDialog dialog(this);
dialog.exec();

運行結果:先彈出mydialog1對話框,把該對話框關掉後纔出現mywidget窗口。該對話框爲模態對話框。

用show()函數建立模態對話框

 QDialog *dialog =new QDialog(this);
 dialog->setModal(true);
    dialog->show();

運行結果:與第一個結果一樣,不過只能先關閉mydialog1對話框,才能關閉mywidget窗口。

總結:要想使一個對話框成爲一個模態對話框,用.exec()函數調用;要想成爲非模態對話框,用new創建,用.show()函數調用。

.show()與.exec()的不同:調用完show後控制權交給調用者,程序繼續往下進行,而exec只有當對話框關閉時才能返回。
思考:setModal函數的作用。
與setModal()函數相似的還有一個setWindowModality()函數,它有一個參數來設置模態對話框要阻塞的窗口類型,可以是:
Qt::NonModal(不阻塞任何窗口,就是非模態),
Qt::WindowModal(阻塞它的父窗口和所有祖先窗口以及它們的子窗口),
Qt::ApplicationModal(阻塞整個應用程序的所有窗口)。
而setModal()函數默認設置的是Qt::ApplicationModal。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章