QT的模态对话框与非模态对话框详解

Qt中,显示一个对话框一般有两种方式:

一种是使用exec()方法,它总是以模态来显示对话框;

另一种是使用show()方法,它使得对话框既可以模态显示,也可以非模态显示,决定它是模态还是非模态的是对话框的modal属性。其定义如下:

modal:bool默认情况下,对话框的该属性值是false,这时通过show()方法显示的对话框就是非模态的。而如果将该属性值设置为true,就设置成了模态对话框,其作用于把QWidget::windowModality属性设置为Qt::ApplicationModal。

而使用exec()方法显示对话框的话,将忽略modal属性值的设置并把对话框设置为模态对话框。一般使用setModal()方法来设置对话框的modal属性。

 如果要设置为模态对话框,最简单的就是使用exec()方法,示例代码如下:

MyDialog myDlg; myDlg.exec();也可以使用show()方法,示例代码如下:

MyDialog myDlg; myDlg.setModal(true); myDlg.show();

 如果要设置为非模态对话框,必须使用show()方法,示例代码如下:

MyDialog myDlg; myDlg.setModal(false);
或者myDlg.setModal();myDlg.show();

Qt中创建模态对话框,主要用到了QDialog的exec函数,示例如下:

SonDialog dlg(this);

int res = dlg.exec();

if (res == QDialog::Accepted)

{

QMessageBox::information(this, “INFORMATION”, “You clicked OK button!”);

}

if (res == QDialog::Rejected)

{

QMessageBox::information(this, “INFORMATION”, “You clicked CANCEL button!”);

}

可以通过exec函数的返回值来判断用户点击了哪个按钮使得模态对话框退出的,这可以使得我们能够根据用户的不同行为在退出模态对话框之后采取不同的处理方法。

接下来我们来进行实践,运行课本上的程序,得到的运行效果是这样的,最后只显示了mywidget窗口,但其实由于操作系统运行速度过快,dialog对象其实是会一闪而过的,这是由于dialog对象只在这个构造函数中有用,等这个构造函数执行完了,dialog也就自动消失了


为了使dialog不消失,我们有两种解决办法:

#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 *dialog = new QDialog(this);

    //dialog->setModal(true);//设置为模态对话框

    //dialog->show();//第一种:调用show()函数,显示对话框

 

    //QDialog dialog(this);

    //dialog.exec();/*第二种:调用exec()函数,但这种方式需要关闭dialog后,mywidget窗口才会出现*/

}

MyWidget::~MyWidget()

{

    delete ui;

}


猜你喜欢

转载自blog.csdn.net/fascinateu/article/details/80684683