Qt Qialog对话框的用法(附带实例)
Qt 中的 QDialog 类是所有对话框类的基类。对话框是一个经常用来完成短小任务或者和用户进行简单交互的顶层窗口。
按照运行对话框时是否还可以和该程序的其他窗口进行交互,对话框常被分为两类:模态的(modal)和非模态的(modeless)。关于这两个概念,下面通过一个例子来进行讲解。
新建 Qt Widgets 应用,项目名称为 mydialog1,基类选择 QWidget,类名为 MyWidget。完成后,打开 mywidget.cpp 文件,先添加 #include <QDialog> 头文件,然后在构造函数中添加代码:
运行程序,会发现一个窗口一闪而过,然后就只显示 MyWidget 窗口了,为什么会这样呢?
因为对于一个函数中定义的变量,等这个函数执行结束后,它就会自动释放。也就是说,这里的 dialog 对象只在这个构造函数中有用,等这个构造函数执行完了,dialog 也就消失了。
为了不让 dialog 消失,读者可以将 QDialog 对象的创建代码更改如下:
其实,不用指针也可以让对话框显示出来,可以将创建代码更改如下:
模态对话框就是在没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互,比如新建项目时弹出的对话框。而对于非模态对话框,既可以与它交互,也可以与同一程序中的其他窗口交互,如一些软件中的“查找与替换”对话框。
就像前面看到的,要想使一个对话框成为模态对话框,则只需要调用它的 exec() 函数;而要使其成为非模态对话框,可以使用 new 操作来创建,然后使用 show() 函数进行显示。其实使用 show() 函数也可以建立模态对话框,在其前面使用 setModal() 函数即可。
例如:
与 setModal() 函数相似的还有一个 setWindowModality() 函数,它有一个参数来设置模态对话框要阻塞的窗口类型,可以是 Qt::NonModal(不阻塞任何窗口,就是非模态)、Qt::WindowModal(阻塞它的父窗口和所有祖先窗口以及它们的子窗口)或 Qt::ApplicationModal(阻塞整个应用程序的所有窗口)三者之一。setModal() 函数默认设置的参数是 Qt::ApplicationModal。
按照运行对话框时是否还可以和该程序的其他窗口进行交互,对话框常被分为两类:模态的(modal)和非模态的(modeless)。关于这两个概念,下面通过一个例子来进行讲解。
新建 Qt Widgets 应用,项目名称为 mydialog1,基类选择 QWidget,类名为 MyWidget。完成后,打开 mywidget.cpp 文件,先添加 #include <QDialog> 头文件,然后在构造函数中添加代码:
QDialog dialog(this); dialog.show();这里在 MyWidget 类的构造函数中定义了一个 QDialog 类对象,还指定了 dialog 的父窗口为 MyWidget 类对象(就是那个 this 参数的作用),最后调用 show() 函数让其显示。
运行程序,会发现一个窗口一闪而过,然后就只显示 MyWidget 窗口了,为什么会这样呢?
因为对于一个函数中定义的变量,等这个函数执行结束后,它就会自动释放。也就是说,这里的 dialog 对象只在这个构造函数中有用,等这个构造函数执行完了,dialog 也就消失了。
为了不让 dialog 消失,读者可以将 QDialog 对象的创建代码更改如下:
QDialog *dialog = new QDialog(this); dialog->show();这里使用了 QDialog 对象的指针,并使用 new 运算符开辟了内存空间,这时再次运行程序就可以正常显示了。这里为 dialog 对象指明了父窗口,所以就没有必要使用 delete 来释放该对象了,因为父对象销毁时会自动将其销毁。
其实,不用指针也可以让对话框显示出来,可以将创建代码更改如下:
QDialog dialog(this); dialog.exec();这时运行程序,则会发现对话框弹出来了,但是 MyWidget 窗口并没有出来,当关闭对话框后,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。