前言

“模态”(Modal)和“非模态”(Non-modal)是描述交互界面中不同类型的用户界面组件(如对话框、窗口等)的术语。

一、定义

1. 模态 (Modal)

模态界面或组件是指在用户与该界面或组件交互时,其他界面部分会被禁用或被遮挡,用户必须先与模态组件进行交互(例如,关闭或确认)才能继续与应用程序的其他部分进行交互。

特征:

  • 阻止用户与主界面进行交互,直到模态对话框被关闭。
  • 通常用于需要用户做出决策或确认的场景(如警告、错误消息、确认框等)。
  • 常见的例子有:文件保存对话框、确认删除提示、用户登录弹窗等。

示例: 当你打开一个文件保存对话框时,直到你点击“保存”或“取消”之前,你无法操作主窗口的其他部分。

2. 非模态 (Non-modal)

非模态界面或组件允许用户在与该组件交互时,仍然可以访问和操作其他界面部分。用户不必关闭非模态组件才能继续其他操作。

特征:

  • 用户可以同时与多个界面部分交互。
  • 非模态组件不会阻塞用户的操作,通常用于辅助性或信息显示类的组件。
  • 常见的例子有:工具栏、消息通知、浮动菜单等。

示例: 打开一个工具栏或信息面板时,你仍然可以继续操作主界面,而不需要先关闭这些面板。

在 GUI 编程中,模态(Modal)和 非模态(Modeless)是指对话框或窗口与应用程序主窗口之间的交互方式。

二、GUI中

1. 模态(Modal)对话框

模态对话框会在显示时 阻止用户与其他窗口进行交互,直到对话框关闭为止。

特点:

  • 显示时会 阻塞其他窗口 的操作,用户必须先处理对话框中的内容(例如确认、取消等),才能回到主窗口或其他窗口进行交互。
  • 在对话框关闭之前,主窗口或其他窗口无法响应用户的操作。

常见应用:

确认对话框:例如,“保存更改”、“是否退出” 等,需要用户明确的选择(如确认或取消)。
登录窗口:在登录完成之前,用户无法进行其他操作。

Qt 中的模态对话框:

例如,QDialog::exec() 创建的是模态对话框,它会阻止应用程序的其他操作,直到对话框关闭。

示例:

QDialog dialog(this);  // 创建一个对话框
dialog.exec();  // 模态,程序会阻塞,直到对话框关闭
在这个例子中,exec() 阻塞了后续代码的执行,用户必须与对话框交互(点击确认或取消)才能继续。

2. 非模态(Modeless)对话框

非模态对话框则允许用户在显示对话框的同时与其他窗口进行交互。

特点:

显示时 不阻止 主窗口或其他窗口的操作,用户可以在对话框打开的同时与其他窗口进行交互。
一般用来显示不需要用户强制响应的工具窗口或信息窗口。

常见应用:

  • 工具窗口:例如,在编辑软件中打开的属性面板或工具栏,用户可以随时关闭或最小化,不需要与主窗口交互。
  • 信息提示框:比如程序的状态信息,用户可以查看并继续工作。

Qt 中的非模态对话框:

例如,QDialog::show() 创建的是非模态对话框,它允许用户在显示对话框时,仍然能够与应用程序的其他部分交互。

示例:

QDialog dialog(this);  // 创建一个对话框
dialog.show();  // 非模态,程序不会被阻塞,可以继续执行后续代码
在这个例子中,show() 不会阻塞后续代码,用户可以在对话框显示的同时继续操作主窗口。

三、模态 vs 非模态 的对比

| d |d |
|–1|–1|
| d| d |

特性模态(Modal)非模态(Modeless)
用户交互阻止与其他窗口的交互允许与其他窗口的交互
窗口行为必须关闭对话框才能返回主窗口不需要关闭即可返回主窗口
使用场景确认、选择、警告窗口等工具窗口、状态信息窗口、设置面板等
Qt 实现exec()(阻塞)show()(非阻塞)

四、何时使用模态和非模态对话框?

  • 模态对话框: 当你希望用户必须对某个问题做出明确回答时,使用模态对话框。例如:
    • 确认是否保存文件
    • 确认退出程序
    • 需要用户输入并提交的数据
    • 登录、注册对话框等
  • 非模态对话框: 当你希望用户能够在与对话框交互的同时继续进行其他操作时,使用非模态对话框。例如:
    • 属性面板、工具栏等
    • 状态信息、日志窗口等

五、Qt 中 exec() 与 show() 的区别

exec():创建一个 模态对话框,会阻塞程序的执行,直到用户关闭对话框并返回结果。

show():创建一个 非模态对话框,不会阻塞程序的执行,用户可以与其他窗口交互。

六、总结

模态对话框:阻止用户与其他窗口交互,直到处理完对话框中的内容。

非模态对话框:允许用户与其他窗口交互,同时处理对话框中的内容。

Logo

NVIDIA官方入驻,分享最新的官方资源以及活动/会议信息,精选收录AI相关技术内容,欢迎大家加入社区并参与讨论。

更多推荐