文章目录
- [pyside6 qt 事件循环](#pyside6 qt 事件循环)
-
- [`gui_app.exec()` 的作用](#
gui_app.exec()的作用) -
- [1. 启动 Qt 事件循环](#1. 启动 Qt 事件循环)
- [2. 窗口显示的前提](#2. 窗口显示的前提)
- 项目中完整的执行调用链
- 为什么窗口需要事件循环才能显示?
-
- [Qt 的工作原理](#Qt 的工作原理)
- 总结
- [`gui_app.exec()` 的作用](#
pyside6 qt 事件循环
gui_app.exec() 的作用
43:43:gf_prewd.py
sys.exit(gui_app.exec())
gui_app.exec() 不创建窗口,它的作用是:
1. 启动 Qt 事件循环
python
gui_app.exec() # 启动事件循环,阻塞主线程
功能:
- 处理 GUI 事件(鼠标、键盘、窗口重绘等)
- 使窗口能够显示和响应交互
- 阻塞主线程,直到窗口关闭
2. 窗口显示的前提
窗口能真正显示的前提:
- 窗口对象已创建(
UI()) - 已调用显示方法(
showMaximized()) - 事件循环已启动(
gui_app.exec())
项目中完整的执行调用链
程序启动
↓
执行模块级别代码
├─> gui_app = QApplication(sys.argv) ← 创建 Qt 应用对象
└─> logger = create_logger(__name__)
↓
执行 if __name__ == '__main__' 代码块
↓
导入 main_module
from module.main_module import main_module
↓
执行 module/main_module.py 末尾代码
main_module = Main_module() ← 这里!
↓
执行 Main_module.__init__()
self.ui = UI() ← 创建窗口对象
↓
执行 UI.__init__()
super(UI, self).__init__() ← 调用 QMainWindow.__init__()
self.setupUi(self) ← 加载 UI 文件
self.showMaximized() ← 显示窗口(但此时还没真正显示)
↓
继续执行其他代码
start_thread(...) ← 启动各种后台线程
↓
执行 gui_app.exec() ← 启动事件循环
↓
【窗口真正显示出来】
↓
事件循环运行
- 处理鼠标事件
- 处理键盘事件
- 处理窗口重绘
- 处理信号槽连接
↓
程序运行直到窗口关闭
为什么窗口需要事件循环才能显示?
Qt 的工作原理
创建窗口对象
↓
调用 show() 或 showMaximized()
↓ 此时窗口只是"标记为显示",但还没有真正显示
启动事件循环 gui_app.exec()
↓
事件循环处理显示事件
↓
窗口真正显示在屏幕上
如果没有 gui_app.exec():
- 窗口对象已创建
showMaximized()已调用- 但窗口不会显示(因为没有事件循环处理显示事件)
- 程序会立即退出
总结
- 窗口创建:在
main_module = Main_module()时,Main_module.__init__()中创建self.ui = UI() - 窗口显示:在
UI.__init__()中调用self.showMaximized() - 事件循环:
gui_app.exec()启动事件循环,使窗口能够显示和响应事件
关键代码位置
python
# 1. 创建窗口(在 module/main_module.py)
main_module = Main_module() # → self.ui = UI()
# 2. 显示窗口(在 ui_function/ui_module.py)
self.showMaximized() # UI.__init__() 中
# 3. 启动事件循环(在 gf_prewd.py)
gui_app.exec() # 使窗口真正显示和响应事件