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

举报
黑兔子 发表于 2022/08/02 14:25:28 2022/08/02
【摘要】 Qt中的模态对话框和非模态对话框。

对于模态和非模态对话框的理解:
QDialog 类是所有对话框窗口类的基类。对话框窗口是一个经常用来完成短小任务或者和用户进行简单交互的顶层窗口。按照运行对话框时是否还可以和改程序的其他窗口进行交互,对话框常被分成模态对话框和非模态对话框。

模态对话框是在对话框关闭之前,不能再与同一个应用程序的其他窗口进行交互。
非模态对话框是可以与同意程序中的窗口交互的。

创建对话框的方法:
我们创建对话框时一般会用到三种方式:

1.使用 new 的方式创建一个非模态对话框:
QDialog *dialog = new QDialog(this);
dialog->show();
通过 new 一个 QDialog 对象指针,指定窗口的父窗口,调用 show()函数显示出来。这样是可以正常显示的,只不过这个窗口是非模态的,他不会阻止这段代码之后的代码的正常运行。并且因为指定了父窗口,所以不需要使用 delete()来释放该对象,在父窗口销毁时,会自动释放所有子窗口。

2.定义临时变量创建一个模态对话框:
QDialog dialog(this);
dialog.exec();
通过这种方式启动一个模态对话框,在程序走到这里时,会弹出对话框,并且这段代码之后的代码将不会执行,只有在这个对话框关闭之后才会继续执行。

3.使用 new 的方式创建一个模态对话框:
QDialog *dialog = new QDialog(this);
dialog->setModal(true);
dialog->show();
通过这种方式启动的对话框也是模态的,它和第一种方法的区别是调用了 setModal()函数。这时虽然是模态对话框,但是在这段代码之后的代码也是可以正常执行的。是因为在调用 show()函数后会立即将控制权交给调用者,程序可以继续往下执行。而调用 exec()函数时,只有当对话框关闭时才会返回。

setModal()函数:
与 setModal()函数功能相似的还有一个 setWindowModality()函数,它有一个参数来设置模态对话框要阻塞的窗口类型,这个参数可以是:
Qt::NonModal()//不阻塞任何窗口,就是非模态
Qt::WindowModal()//阻塞它的父窗口、所有祖先窗口以及他们的子窗口
Qt::ApplicationModal()//阻塞整个应用程序的所有窗口
setModal()函数默认设置的是 Qt::ApplicationModal。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。