Qt QDialog 模态对话框和非模态对话框

一个困扰我很久的关于弹出对话框效果显示的问题, 虽然我知道应该是哪里设置下就可以了, 但是查了很久的文档也没能最终找到答案, 不过今天居然无意间被我解决了.
虽然已经实现了一个类似的效果, 但是还是用系统的好, 只需要修改一行代码就完成了(Ps: 之前写了几十行代码o(╯□╰)o)

对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。尽管 Ribbon 界面的出现在一定程度上减少了对话框的使用几率,但是,我们依然可以在最新版本的 Office 中发现不少对话框。因此,在可预见的未来,对话框会一直存在于我们的程序之中。

Qt 中使用QDialog类实现对话框。就像主窗口一样,我们通常会设计一个类继承QDialog。QDialog(及其子类,以及所有Qt::Dialog类型的类)的对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。

QDialog的模态与非模态区别

模态对话框

简介: 在关闭模式对话框之前,程序不能进行其他工作

1
2
3
4
5
6
7
8
// exec()方法: 它总是以模态来显示对话框
Dialog *dialog = new Dialog(this);
dialog->exec();
// show()方法,它使得对话框既可以模态显示,也可以非模态显示,决定它是模态还是非模态的是对话框的modal属性
Dialog *dialog2 = new Dialog(this);
dialog2->setModal(true);
dialog2->show();

下图中当Dialog没关闭前, 无法操作MainWindow

qq20170926-163259 2x

非模态对话框

简介: 运行在应用程序中,对于任何其他窗口都是独立窗口

1
2
3
Dialog *dialog = new Dialog(this);
// dialog2->setModal(false); // 默认是false
dialog->show();

下图中DialogMainWindow互不影响

qq20170926-162738 2x

特殊的模态对话框

简介: 在关闭模式对话框之前, 程序可以修改父窗口的大小, 并且对话框会固定停留在父窗口的标题下面

1
2
Dialog *dialog = new Dialog(this);
dialog->open();

效果如下图

qq20170926-163208 2x