一、概念
1. 对话框是与用户进行简短交互的顶层窗口。
2. 其中QDialog是继承自QWidget的所有对话框的基类。
3. QDialog是一种容器类型的组件。
4. QDialog作为一种专用的交互窗口而存在,所以在设计上应该保证功能单一。
5. 由于QDialog是顶层窗口,所以不能把它嵌入到其他容器里面。
6. QDialog是定制了窗口式样的的特殊的QWidget。
7. QDialog和QWidget在样式上很相像,但是在细节上实现不同,所以将这些细节封装成一个类后根据实际需要进行不同的开发。
8. 怎么使用QWidget就可以怎么使用QDialog。
9. 当QDialog对象作为QWidget对象的父组件时,此时就只有一个QDialog窗口了,因为当QWidget对象有父组件时它将作为一个可见的部件嵌入到父组件窗口中。
10. QWidget也能创建对话框和顶层窗口,使用QDialog类的意义是软件复用。
11. QDialog一定是一个顶层窗口(Dialog窗口永远出现在Widget窗口上面,而不是被嵌套在QWidget中),式样被定制了。
12. QDialog和QWidget并不相同 ,细节实现上不同。
在不做其他处理的情况下,两者在样式上基本一致。
二、对话框类型
不管是模态对话框还是非模态对话框都需要指定父组件,这样才能达到作为顶层窗口的效果
(1)模态对话框
1. 模态对话框调用方式:QDialog::exec();
2. 模态对话框显示后无法与其他窗口进行交互
3. 模态对话框是一种阻塞式的对话框调用方式,阻塞其他窗口的行为的同时也阻塞代码。
4. 模态对话框用于必须依赖用户选择的场合,比如消息提示、字体颜色选择、打印设置等。
5. 在栈上创建模态对话框是最简单的方式,因为栈上的代码在执行完后就会被释放,刚好和模态对话框的性质吻合。
6. 只有模态对话框才有返回值的概念,用于表示交互结果。
7. QDialog::Accepted表示用户操作成功。
8. QDialog::Recjected表示用户操作失败。
9. 通过done(int i)函数用于关闭对话框,同时可以通过参数i设置模态对话框的返回值。
QDialog dialog(this);//指定父组件为this指针
dialog.exec();
(2)非模态对话框
1. 非模态对话框调用方式:QDialog::show();
2. 非模态对话框显示后是独立存在的,此时可以同时与父窗口进行交互。
3. 非模态对话框是一种非阻塞式的对话框调用方式。
4. 非模态对话框用于特殊功能设置的场合,比如属性设置等。
5. 非模态对话框一般需要在堆上进行创建,因为函数栈执行完就会释放,在栈上创建的对应的对话框对象也就会被释放, 由于非模态对话框可以独立存在,不影响与主窗口的交互,故需要在堆上创建。
QDialog* dialog = new QDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose)
dialog->show();
(3)混合特性对话框
- 通过一套函数既可以设置成模态属性,也可以设置成非模态。
- 通过Dialog::setModal()函数可以设置混合特性的对话框。
- 非模态对话框需要在函数中指定Qt::WA_DeleteClose 属性。
- 指定属性后关闭非模态对话框后就会自动释放对话框对象在堆空间的指向的内存空间
QDialog* dialog = new QDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose);//设置属性,窗口关闭后自动释放内存
//设置具有模态和非模态的属性,窗口不会发生阻塞,同时具有模态属性
dialog->setModal(true);
dialog->show();
小结
- 对话框分为模态对话框和非模态对话框。
- 模态对话框是阻塞式的。
- 模态对话框用于依赖用户操作的场合。
- 非模态对话框是非阻塞的。
- 非模态对话框用于功能设置等场合