模态(Modal)和非模态(Non-modal)是窗口或对话框在应用程序中显示和交互的两种方式,它们直接影响用户在界面中的操作顺序和自由度。
1. 模态对话框(Modal Dialog)
模态对话框是一种阻塞窗口,它会阻止用户与应用程序中的其他窗口进行交互,直到用户关闭该对话框。通常情况下,当模态对话框打开时,用户必须先完成该对话框的操作(例如点击“确定”或“取消”)才能返回到主窗口或其他部分。
特点:
- 当模态对话框显示时,用户不能与父窗口或其他窗口交互。
- 模态对话框的典型用途是需要用户做出决定或完成某项任务,比如确认对话框、输入对话框或警告框。
- 通过
QDialog::exec()
方法启动模态对话框,该方法会阻塞执行,直到对话框被关闭。
常见场景:
- 当你需要强制用户完成某个操作或确认信息时,例如保存文件前的确认框、用户登录窗口等。
Qt 示例:
QMessageBox
、QFileDialog
和QInputDialog
等类通常默认是模态的。- 启动模态对话框的典型方式是调用
exec()
:
QMessageBox msgBox;
msgBox.setText("Are you sure you want to delete this file?");
msgBox.exec(); // 模态,对话框阻塞,直到用户作出决定
2. 非模态对话框(Non-modal Dialog)
非模态对话框是一种不阻塞的窗口,允许用户与应用程序中的其他窗口同时进行交互。在非模态对话框显示时,用户仍然可以继续操作主窗口或其他窗口,而不必先关闭对话框。
特点:
- 当非模态对话框打开时,用户可以自由切换到应用程序的其他部分进行操作。
- 这种模式通常用于辅助任务,不要求用户必须立即处理该对话框。
- 通过
QDialog::open()
或QWidget::show()
方法启动非模态对话框。
常见场景:
- 当你希望提供一个可以参考或随时关闭的辅助窗口时,比如查找和替换窗口、帮助窗口等。
Qt 示例:
- 启动非模态对话框的典型方式是调用
show()
或open()
,而不是exec()
:
QDialog *dialog = new QDialog(this);
dialog->setWindowTitle("Non-modal Dialog");
dialog->show(); // 非模态,对话框显示时,主窗口仍可交互
3.总结
那么我们说模态呢,就是一种阻塞窗口,用户和应用程序不能切换到其他窗口进行交互,会阻塞等待当前窗口选择完毕才能与其他窗口进行交互,非模态是一种非阻塞窗口,允许用户和应用程序与其他窗口进行交互,用户不必操作完当前窗口就能切换到其他窗口进行操作