1.概要
1.1.模态和非模态
-
非模态窗口show():
- 非阻塞式交互:非模态窗口允许用户在窗口打开的同时,继续与应用程序的其他部分进行交互。例如,在一个文字处理程序中,查找和替换窗口通常是非模态的,用户可以在查找和替换的同时,继续编辑文档。
- 独立性:非模态窗口是一个独立的窗口,它不会阻塞用户对其他窗口的操作。
-
模态对话框exec():
- 阻塞式交互:模态对话框会阻塞用户与其他窗口的交互。在模态对话框打开期间,用户必须完成对话框中的操作(如点击“确定”或“取消”按钮)并关闭对话框后,才能继续与应用程序的其他部分进行交互。
- 独占性:模态对话框在显示时,通常会将其他窗口置于不可用状态,强制用户专注于对话框的内容。
1.2.全屏显示
w.showFullScreen(); // 全屏显示
1.3.全屏显示+模态对话框
dialog.showFullScreen(); // 全屏显示对话框
dialog.exec(); // 启动模态事件循环
2.内容
在Qt框架中,show()
和exec()
是两个用于管理窗口显示和事件循环的方法,它们有不同的用途和行为。
show()
- 用途:
show()
方法用于显示一个窗口。当你创建一个窗口(比如一个QWidget
或QMainWindow
对象)并希望它在屏幕上可见时,你会调用这个方法。 - 行为: 调用
show()
后,窗口会被绘制在屏幕上,并且窗口的事件(如鼠标点击、键盘输入等)会被放入事件队列中等待处理。但是,show()
本身不会阻塞代码的进一步执行。也就是说,调用show()
之后的代码会继续执行,而不会等待窗口关闭。 - 适用场景: 当你希望窗口在应用程序的其余部分继续运行的同时保持打开状态时,使用
show()
。
exec()
- 用途:
exec()
方法通常与对话框(如QDialog
)一起使用,用于启动事件循环,直到对话框关闭。 - 行为: 当你调用一个对话框的
exec()
方法时,它会启动一个局部的事件循环,这个循环会一直运行,直到对话框关闭(例如用户点击了“确定”或“取消”按钮)。在对话框关闭之前,exec()
方法不会返回,这意味着调用exec()
之后的代码只有在对话框关闭后才会执行。 - 适用场景: 当你希望程序暂停执行,直到用户处理完对话框(如确认操作、输入信息等)时,使用
exec()
。
总结
show()
: 显示窗口并立即返回,不阻塞后续代码的执行。适用于需要窗口在后台运行或与其他窗口交互的场景。exec()
: 显示对话框并启动一个事件循环,直到对话框关闭才返回。适用于需要用户完成某些操作后才能继续执行的场景。
选择使用哪个方法取决于你的具体需求,即你是希望窗口在后台运行还是希望程序等待用户完成对话框中的操作。
3.关联链接
4.关联知识
1.全屏模式是属于show()还是exec()
全屏模式既不属于 show()
也不属于 exec()
,而是属于窗口的一种显示状态。在Qt中,要实现全屏模式,可以使用窗口对象(如 QWidget
或其子类 QMainWindow
)的 showFullScreen()
方法。
全屏显示方法
-
使用
showFullScreen()
方法:- 这是最直接和常用的方法,适用于
QWidget
及其子类。 - 调用
showFullScreen()
方法后,窗口会立即进入全屏状态。
- 这是最直接和常用的方法,适用于
-
使用
setWindowState()
方法:- 这种方法通过改变窗口的状态来实现全屏显示。
- 它需要将当前窗口状态与
Qt::WindowFullScreen
进行按位异或操作。不过,这种方法更适用于需要在全屏和普通状态之间切换的场景。
全屏模式与 show()
和 exec()
的关系
-
show()
:- 用于显示窗口,但本身并不控制窗口的显示状态(如全屏、最大化、最小化等)。
- 在调用
showFullScreen()
方法之前或之后,可以调用show()
来确保窗口可见。
-
exec()
:- 通常与对话框一起使用,用于启动事件循环。
- 全屏模式与
exec()
没有直接关系,但对话框也可以实现全屏显示。
示例代码
以下是一个使用 showFullScreen()
方法实现全屏显示的简单示例:
#include <QApplication>
#include <QMainWindow>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QMainWindow w;
w.showFullScreen(); // 全屏显示
return a.exec();
}
在这个示例中,showFullScreen()
方法用于将主窗口设置为全屏模式,而 show()
方法则不是必须的,因为 showFullScreen()
已经隐含了显示窗口的操作。
总结来看,全屏模式是一种窗口的显示状态,可以通过 showFullScreen()
方法实现,与 show()
和 exec()
方法没有直接的归属关系。
2.showFullScreen() +exec(),会是什么效果
在Qt中,将showFullScreen()
与exec()
结合使用时,效果取决于你使用的对象类型以及你的代码结构。通常,showFullScreen()
用于使窗口(如QMainWindow
或QWidget
)以全屏模式显示,而exec()
通常与模态对话框(如QDialog
)一起使用来启动一个事件循环,直到对话框关闭。
结合使用的场景
-
对于非模态窗口(如
QMainWindow
):- 如果你在一个非模态窗口(比如
QMainWindow
)上调用showFullScreen()
,然后尝试调用exec()
,这通常是不合适的,因为exec()
是设计用于模态对话框的。 - 非模态窗口不需要
exec()
来保持事件循环运行,因为应用程序的主事件循环通常由QApplication::exec()
管理。 - 如果你在非模态窗口上调用
exec()
,可能会导致程序行为异常或冻结,因为exec()
会阻塞当前线程的事件处理,直到某个对话框关闭,但非模态窗口本身并不是对话框。
- 如果你在一个非模态窗口(比如
-
对于模态对话框:
- 如果你有一个模态对话框(
QDialog
),并且希望它以全屏模式显示,你可以先调用showFullScreen()
,然后调用exec()
。 - 这种情况下,对话框会以全屏模式显示,并且事件循环会运行,直到对话框关闭。
- 这是一种合理的用法,因为
exec()
用于模态对话框是合适的,而全屏只是对话框的一种显示状态。
- 如果你有一个模态对话框(
示例代码
以下是一个使用QDialog
以全屏模式显示的简单示例:
#include <QApplication>
#include <QDialog>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QDialog dialog;
dialog.showFullScreen(); // 全屏显示对话框
dialog.exec(); // 启动模态事件循环
return a.exec(); // 应用程序主事件循环
}
总结
- 非模态窗口:通常不需要也不应该使用
exec()
,因为这会干扰应用程序的正常事件处理。 - 模态对话框:可以结合
showFullScreen()
和exec()
使用,以实现全屏模态对话框的效果。
因此,结合showFullScreen()
和exec()
的效果取决于你使用的窗口类型。对于模态对话框,这种结合是合理的;对于非模态窗口,则通常不需要这样做。
3.非模态窗口和模态对话框的差别
非模态窗口和模态对话框在Qt(以及其他图形用户界面框架,如Windows API、MFC等)中的区别主要体现在它们与用户的交互方式上。以下是它们的主要差别:
1. 交互行为
-
非模态窗口:
- 非阻塞式交互:非模态窗口允许用户在窗口打开的同时,继续与应用程序的其他部分进行交互。例如,在一个文字处理程序中,查找和替换窗口通常是非模态的,用户可以在查找和替换的同时,继续编辑文档。
- 独立性:非模态窗口是一个独立的窗口,它不会阻塞用户对其他窗口的操作。
-
模态对话框:
- 阻塞式交互:模态对话框会阻塞用户与其他窗口的交互。在模态对话框打开期间,用户必须完成对话框中的操作(如点击“确定”或“取消”按钮)并关闭对话框后,才能继续与应用程序的其他部分进行交互。
- 独占性:模态对话框在显示时,通常会将其他窗口置于不可用状态,强制用户专注于对话框的内容。
2. 使用场景
-
非模态窗口:
- 辅助信息:用于显示辅助信息,如工具条、状态栏、提示信息等。
- 并行操作:允许用户进行并行操作,如查找和替换、设置选项等。
- 提升用户体验:通过允许用户同时操作多个窗口,提升用户体验和工作效率。
-
模态对话框:
- 确认操作:用于提示用户确认某项操作,如删除文件、关闭窗口等。
- 获取用户输入:用于获取用户输入,如填写表单、输入密码等。
- 重要决策:用于显示重要信息或让用户做出重要决策,如错误提示、操作成功提示等。
3. 编程实现
-
非模态窗口:
- 创建和显示:通常使用
show()
方法来显示非模态窗口。 - 事件处理:非模态窗口与应用程序共用同一个事件循环,不会启动新的消息循环。
- 关闭窗口:使用
close()
或destroy()
方法来关闭非模态窗口。
- 创建和显示:通常使用
-
模态对话框:
- 创建和显示:通常使用
exec()
方法来显示模态对话框。exec()
会启动一个新的消息循环,直到对话框关闭才返回。 - 事件处理:模态对话框在显示期间,会阻塞其他窗口的事件处理。
- 关闭对话框:使用
accept()
(相当于点击“确定”按钮)或reject()
(相当于点击“取消”按钮)方法来关闭模态对话框。
- 创建和显示:通常使用
4. 视觉和交互设计
-
非模态窗口:
- 标题栏和菜单:通常包含标题栏和系统菜单按钮,允许用户移动窗口和访问窗口菜单。
- 可移动性:用户可以使用鼠标或键盘将非模态窗口移动到另一个显示区域。
-
模态对话框:
- 标题栏和菜单:有时可能不包含标题栏和菜单按钮,以强制用户专注于对话框的内容。
- 固定位置:模态对话框在显示时,通常位于屏幕中央或固定位置,不允许用户随意移动。
5. 资源管理
-
非模态窗口:
- 动态创建:非模态窗口对象通常使用
new
操作符动态创建,并在窗口关闭后用delete
操作符删除。 - 生命周期管理:需要程序员显式地管理非模态窗口对象的生命周期。
- 动态创建:非模态窗口对象通常使用
-
模态对话框:
- 自动管理:模态对话框通常在
exec()
方法返回后自动删除,程序员无需显式地管理其生命周期。
- 自动管理:模态对话框通常在
总结来看,非模态窗口和模态对话框在Qt中的主要差别体现在它们的交互行为、使用场景、编程实现、视觉和交互设计以及资源管理等方面。选择使用哪种类型的窗口或对话框,取决于你的具体需求和应用程序的用户界面设计。