QDialog类是所有对话框窗口类的基类。对话框窗口是一个经常用来完成短小任务或者和用户进行简单交互的顶层窗口。按照运行对话框时是否还可以和该程序的其他窗口进行交互,对话框常被分为两类:模态的(modal 阻塞)和非模态的(modeless 非阻塞)。
1、直接创建对象,但是对话框会一闪而过
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
QDialog dialog(this);
dialog.show();
}
因为对于一个函数中定义的变量,等这个函数执行结束后,它就会自动释放。也就是说,这里的 dialog对象只在这个构造函数中有用,等这个构造函数执行完了,dialog 也就消失了。
2、为了不让 dialog 消失,可以将 QDalog 对象的创建代码更改如下:
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
QDialog dialog(this);
dialog.exec();
}
这时运行程序就会发现对话框弹出来了,但是MyWidget 窗口并没有出来,只有当关闭对话框后,MyWidget 窗口才弹出来。这个对话框与前面那个对话框的效果不同,称它为模态对话框,而前面那种对话框称为非模态对话框
模态对话框就是在没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互,比如新建项目时弹出的对话框。而对于非模态对话框,既可以与它交互,也可以与同一程序中的其他窗口交互,如Microsoft Word 中的查找替换对话框。就像前面看到的,要想使一个对话框成为模态对话框,则只需要调用它的 exec()函数;而要使其成为非模态对话框,则可以使用 new 操作来创建,然后使用 show()函数来显示。其实使用show()函数也可以建立模态对话框,只须在其前面使用setModal()函数即可。
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
QDialog *dialog = new QDialog(this);
dialog->setModal(true);
dialog->show();
}
此时运行起来对话框和主界面都可以显示出来了,但是只有关闭模态对话框以后,才可以点击主界面
运行程序后可以看到,生成的对话框是模态的。但是,它与用exec()函数时的效果是不一样的,因为现在的MyWidget 窗口也显示出来了。这是因为调用完show()函数后会立即将控制权交给调用者,程序可以继续往下执行。而调用exec()函数却不同,只有当对话框被关闭时才会返回。与setModal()函数相似的还有一个setWindowModality()函数,它有一个参数来设置模态对话框要阻塞的窗口类型,可以是Qt::NonModal(不阻塞任何窗口,就是非模态)Qt::WindowModal(阻塞它的父窗口所有祖先窗口以及它们的子窗口)或Qt::ApplicationModal阻塞整个应用程序的所有窗口)。而setModal()函数默认设置的是Qt::ApplicationModal。