#include "mywidget.h" #include "ui_mywidget.h" #include <QDialog> MyWidget::MyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MyWidget) { ui->setupUi(this); QDialog dialog(this); dialog.show(); QDialog dialog2(this); dialog2.exec(); } MyWidget::~MyWidget() { delete ui; }
创建dialog对象,运行程序会发现一个对话框窗口一闪而过,然后只显示MyWidget类对象得窗口。
因为构造函数一结束,对象也会被释放。
为了不让dialog消失,可以将QDialog对象得创建代码改如下:
QDialog * dialog = new QDialog(this);
dialog ->show();
不是定义一个对象,而是定义了一个指向QDialog类对象的指针变量。且对象指向了父窗口,所以没必要使用delete来释放该对象。
其实不用指针也可以让对话框显示出来:
QDialog dialog(this);
dialog.exec();
这时对话框就会弹出来了,但是MyWideget对象的窗口并没有出来,关闭对话框后,MyWidget对象的窗口才会弹出来。这种对话框称为模态对话框。
上面的那种可以同时与另外一个对话框进行交互称为非模态对话框。
想要使一个对话框成为模态对话框,只需要调用它的exec()函数,而要使用其成为非模态对话框,可以使用new操作来创建,然后使用show()函数来显示。其实也可以使用show()函数也可以建立模态对话框,只需在其前面使用setModal()函数即可。
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.