第21章 PyQt GUI开发
第21章 PyQt GUI开发
学习目标
完成本章学习后,读者应能够:
- 理解Qt框架架构:掌握Qt对象模型、事件循环与父子对象树
- 精通信号与槽机制:理解Qt的核心通信模式,实现自定义信号与跨线程通信
- 掌握布局与样式:灵活运用布局管理器与QSS样式表构建专业级界面
- 实现MVC架构:使用Model/View架构处理数据展示
- 掌握多文档界面:实现MDI、SDI与停靠窗口
- 运用多线程:使用QThread与QThreadPool构建响应式GUI
- 集成Qt Designer:通过UI文件与资源系统加速开发
21.1 Qt框架基础
21.1.1 Qt对象模型
Qt框架的核心是QObject对象模型,提供对象树、信号槽和事件过滤等机制:
1 | ┌─────────────────────────────────────────┐ |
21.1.2 应用程序架构
1 | import sys |
21.2 信号与槽机制
21.2.1 信号槽原理
信号与槽(Signals and Slots)是Qt的核心通信机制,实现了对象间的松耦合通信:
1 | 发送者(Sender) 接收者(Receiver) |
1 | from PyQt6.QtCore import QObject, pyqtSignal, pyqtSlot |
21.2.2 自定义信号与跨对象通信
1 | from PyQt6.QtCore import QObject, pyqtSignal |
21.3 布局与样式
21.3.1 布局管理器
1 | from PyQt6.QtWidgets import ( |
21.3.2 QSS样式表
1 | DARK_STYLE = """ |
21.4 Model/View架构
21.4.1 自定义模型
1 | from PyQt6.QtCore import Qt, QAbstractTableModel, QModelIndex |
21.5 多线程GUI
21.5.1 QThread与工作对象
1 | from PyQt6.QtCore import QThread, pyqtSignal, QObject, Qt |
21.6 Qt Designer集成
21.6.1 使用UI文件
1 | from PyQt6.QtWidgets import QApplication, QMainWindow |
21.6.2 资源系统
1 | from PyQt6.QtGui import QIcon |
资源文件 resources.qrc:
1 | <RCC> |
编译资源文件:
1 | pyside6-rcc resources.qrc -o resources_rc.py |
21.7 综合实例:Markdown编辑器
1 | import sys |
21.8 前沿技术动态
21.8.1 PyQt6新特性
- 高DPI支持:自动缩放,无需手动处理
- Python类型提示:完整的类型注解支持
- QML与Python:通过PyQt6绑定QML前端
- Qt for WebAssembly:浏览器中运行Qt应用
21.8.2 替代框架对比
| 特性 | PyQt6 | PySide6 | Tkinter |
|---|---|---|---|
| 许可证 | GPL/商业 | LGPL | Python |
| 控件丰富度 | ★★★★★ | ★★★★★ | ★★★ |
| 样式定制 | QSS | QSS | 有限 |
| 设计器 | Qt Designer | Qt Designer | 无 |
| 文档 | 丰富 | 官方 | 一般 |
| 打包体积 | 大 | 大 | 小 |
| 学习曲线 | 陡 | 陡 | 平缓 |
21.9 本章小结
本章系统阐述了PyQt6 GUI开发的核心知识体系:
- Qt框架基础:QObject对象模型、事件循环与父子对象树
- 信号与槽:Qt核心通信机制、自定义信号与跨对象通信
- 布局与样式:布局管理器、QSplitter与QSS样式表
- Model/View架构:自定义表格模型与数据展示
- 多线程GUI:QThread工作对象模式与线程安全通信
- Qt Designer集成:UI文件加载与资源系统
- 综合实例:Markdown编辑器的完整实现
21.10 习题与项目练习
基础题
使用PyQt6创建一个登录窗口,包含用户名、密码输入框,实现表单验证与信号槽通信。
实现一个支持加减乘除的计算器,使用QGridLayout布局。
创建一个文本编辑器,支持新建、打开、保存功能,使用QSS设置暗色主题。
进阶题
使用QAbstractTableModel实现一个可排序、可过滤的数据表格,支持CSV导入导出。
实现一个多线程文件搜索工具,搜索过程中界面保持响应,实时显示进度和结果。
使用QSplitter实现一个双面板文件管理器,左侧目录树,右侧文件列表。
综合项目
数据库管理工具:构建一个SQLite数据库管理GUI应用,包含:
- 数据库连接管理
- 表结构浏览与编辑
- SQL查询编辑器与结果展示
- 数据导入/导出(CSV、JSON)
- 使用Model/View架构
RSS阅读器:构建一个桌面RSS阅读器,包含:
- RSS订阅管理(增删改查)
- 文章列表与内容预览
- 多线程后台刷新
- 收藏与标记已读
- 搜索与过滤功能
思考题
PyQt6的信号槽机制与回调函数相比有何优势?在大型项目中如何避免信号槽连接导致的内存泄漏?
QThread的
moveToThread模式与继承QThread重写run()方法有何区别?为什么推荐使用前者?
21.11 延伸阅读
21.11.1 Qt官方资源
- Qt官方文档 (https://doc.qt.io/qt-6/) — Qt 6权威指南
- PyQt6文档 (https://www.riverbankcomputing.com/static/Docs/PyQt6/) — Python绑定文档
- PySide6文档 (https://doc.qt.io/qtforpython/) — Qt官方Python绑定
21.11.2 进阶书籍
- 《Rapid GUI Programming with Python and Qt》 (Mark Summerfield) — Qt经典教程
- 《Qt 6 C++ GUI Programming Cookbook》 — Qt实战技巧
- 《Mastering GUI Programming with Python》 — PyQt6高级教程
21.11.3 工具与资源
- Qt Designer (https://doc.qt.io/qt-6/qtdesigner-manual.html) — 可视化界面设计器
- Qt Creator (https://www.qt.io/product/development-tools) — 集成开发环境
- QSS样式参考 (https://doc.qt.io/qt-6/stylesheet-reference.html) — 样式表参考
21.11.4 社区与生态
- Qt Forum (https://forum.qt.io/) — Qt社区论坛
- Qt Examples (https://doc.qt.io/qt-6/qtexamplesandtutorials.html) — 官方示例
- Qt Blog (https://www.qt.io/blog) — Qt官方博客
下一章:第22章 测试驱动开发



