模態和非模態對話框。
模態對話框:當它彈出後,本應用程序其他窗口將不再接受用戶輸入,只有該對話框響應用戶輸入,在對它進 行相應操作退出後,其他窗口才能繼續與用戶交互。(比如: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。