模态与非模态
QDialog的显示有两个函数show()和exec()
他们的区别在参考文档上的解释如下:
1.show():
显示一个非模式对话框。控制权即刻返回给调用函数。
弹出窗口是否模式对话框,取决于modal属性的值。
(原文:Shows the dialog as a modeless dialog. Control returns immediately to the calling code.
The dialog will be modal or modeless according to the value of the modal property. )
2.exec():
显示一个模式对话框,并且锁住程序直到用户关闭该对话框为止。函数返回一个DialogCode结果。
在对话框弹出期间,用户不可以切换同程序下的其它窗口,直到该对话框被关闭。
(原文:Shows the dialog as a modal dialog, blocking until the user closes it. The function returns a DialogCode result.
Users cannot interact with any other window in the same application until they close the dialog. )
那么,以我的理解,模态的对话框就是在它没有被关闭之前,不能再与同一个应用程序的其他窗口进行交互,比如新建项目的时候弹出来的对话框就属于模态的。
而非模态的对话框不阻塞任何窗口。
示例代码(非模态):
#include "mainwindow.h"
#include <QApplication>
#include <QDialog>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QDialog *dlg1=new QDialog();
dlg1->show();
QDialog *dlg=new QDialog();
dlg->setModal(true);
dlg->exec();
return a.exec();
}
运行截图:
示例代码(模态):
#include "mainwindow.h"
#include <QApplication>
#include <QDialog>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QDialog *dlg=new QDialog();
dlg->setModal(true);
dlg->exec();
QDialog *dlg1=new QDialog();
dlg1->show();
return a.exec();
}
运行截图:
区别:
可以看到,两个示例程序中只是将模态与非模态的代码顺序调换了一下,就产生了不同的结果。
那么,结果就是在非模态程序中,可以允许两个窗口交替的交互;而在模态的程序中就不行,也即:要先关闭了模态的窗口后才可以弹出非模态的窗口。
TZ
2017.4.7下午于华中农业大学逸夫楼
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY