对话框通常是顶层窗口,出现在程序最上层,实现短期任务和用户交互。
QDialog
(及其子类,以及所有Qt::Dialog
类型的类)的对于其 parent 指针都有额外的解释:
如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。
顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置,无任务栏图标。
1、对话框类型?
模态和非模态,Qt 有两种级别的模态对话框:应用程序级别的模态和窗口级别的模态,默认是应用程序级别的模态。
应用程序级别的模态是指,当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口。
窗口级别的模态是指,该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。
2、如何实现模态对话框和非模态?
QT使用QDialog::exec实现对话框的应用程序级别的模态
QDialog::open()
实现窗口级别的模态对话框
使用QDialog::show()
实现非模态对话框。
例子1
void MainWindow::open()
show函数不会阻塞当前线程,对话框会一闪而过,原因dialog建立在栈上,退出作用域,会被析构,窗口不存在。
解决办法
创建堆上的对话框
堆上创建,必须释放内存。如何实现
dialog 的
dialog(this);
不用动态申请,基类控件释放的时候自动释放子类控件。窗口会一直显示的模态对话框
show也可以实现模态对话框:
QDialog *
dialog->setModel(true);
dialog->show();
主窗口和此模态对话框可以同时显示,exec只能显示对话框一个,关闭其他窗口才会显示。