本文内容:
1.区分和使用模态和非模态对话框。
2.多窗口切换。

模态和非模态对话框。

模态对话框:当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进 行相应操作退出后,其他窗口才能继续与用户交互。(比如: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是窗口。
QT基础(三)对话框QD
不用指针,用.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函数的作用。

相关文章: