核心概念:它们各自扮演什么角色?
它们分工明确,各司其职:

-
Qt Designer (UI 设计师)
- 角色: 界面设计器,这是一个可视化的工具,让你像画图一样,通过拖拽控件(如按钮、文本框、菜单栏等)来创建用户界面。
- 产出物: 它不生成 Python 代码,而是生成一个
.ui文件,这个.ui文件是一个 XML 格式的文件,它描述了你的界面长什么样,有哪些控件,它们的位置、大小、属性等。 - 优点:
- 所见即所得: 设计界面非常直观,无需关心复杂的布局代码。
- 关注点分离: 界面设计(UI)和程序逻辑(Logic)被分开,设计师可以专注于
.ui文件,而程序员可以专注于 Python 代码。 - 快速原型: 可以快速搭建出界面原型,方便讨论和修改。
-
Python (程序员)
- 角色: 逻辑实现者,你使用 Python 编写程序,实现界面的功能,
- 当用户点击按钮时,执行什么操作。
- 如何从文本框中读取数据。
- 如何将数据显示在表格中。
- 如何处理文件、网络请求等后台任务。
- 工作方式: Python 代码需要读取 Qt Designer 生成的
.ui文件,并将其转换成 Python 可以理解和操作的界面对象,你再将事件处理函数(比如按钮点击的槽函数)连接到这些界面对象上。
- 角色: 逻辑实现者,你使用 Python 编写程序,实现界面的功能,
协同工作流程
整个过程可以概括为以下几个步骤:
- 设计界面: 使用 Qt Designer 创建界面,保存为
.ui文件(my_window.ui)。 - 转换/加载 UI: 在 Python 代码中,使用
PyQt或PySide库提供的工具,将.ui文件转换成 Python 代码(.py文件),或者直接在运行时加载.ui文件。 - 编写逻辑: 在 Python 代码中,编写业务逻辑,连接信号和槽。
- 运行程序: 执行 Python 脚本,即可看到你设计的界面,并与之交互。
核心桥梁:PyQt / PySide
要将 Qt Designer 和 Python 连接起来,你需要一个 Python 绑定库,最主流的两个选择是:

- PyQt5 / PyQt6: 由 Riverbank Computing 公司开发,功能强大,但商业使用需要购买许可证。
- PySide2 / PySide6: 由 Qt 公司官方维护,与 Qt 的更新同步更快,并且使用 LGPL 许可证,对商业应用非常友好。PySide6 是目前推荐使用的最新版本。
推荐选择: 对于新项目,强烈推荐使用 PySide6。
实战演练:创建你的第一个 Qt + Python 应用
我们将以 PySide6 为例,走完整个流程。
第 1 步:安装环境
你需要安装 Python 和 PySide6,打开你的终端或命令行工具,运行:
pip install PySide6
第 2 步:使用 Qt Designer 创建界面
-
启动 Qt Designer:
(图片来源网络,侵删)- 如果你通过
pip安装了 PySide6,通常可以在命令行直接运行:pyside6-designer
- 或者,如果你安装了完整的 Qt 开发工具,可以在开始菜单中找到它。
- 如果你通过
-
创建新窗口:
- 启动后,选择 "Main Window" 并点击 "Create"。
- 你会看到一个空的主窗口,左侧是 "Widget Box"(控件箱)。
-
拖拽控件:
- 从 "Widget Box" 中拖拽一个
QPushButton(按钮)和一个QLineEdit(单行文本框)到窗口中央。 - 选中按钮,在右下角的 "Property Editor"(属性编辑器)中,将其
objectName修改为pushButton,将text修改为 "点击我"。 - 选中文本框,将其
objectName修改为lineEdit。
- 从 "Widget Box" 中拖拽一个
-
保存文件:
- 点击
File -> Save As...,将文件保存为main_window.ui。
- 点击
第 3 步:将 .ui 文件转换为 Python 代码(推荐方法)
有两种主流方法将 .ui 文件集成到 Python 项目中。
使用 pyside6-uic 工具进行预编译(推荐)
这种方法将 .ui 文件一次性转换成 .py 文件,程序运行时直接加载 Python 模块,效率更高。
-
转换 UI 文件: 在你的终端中,运行以下命令,将
main_window.ui转换为main_window_ui.py:pyside6-uic main_window.ui -o main_window_ui.py
-
编写主程序
app.py: 创建一个新的 Python 文件app.py如下:import sys from PySide6.QtWidgets import QApplication, QMainWindow # 导入由 .ui 文件转换而来的 Python 模块 from main_window_ui import Ui_MainWindow class MainWindow(QMainWindow): def __init__(self): super().__init__() # 设置由 .ui 文件生成的界面 self.ui = Ui_MainWindow() self.ui.setupUi(self) # --- 在这里连接信号和槽 --- # 将按钮的 clicked 信号连接到我们的 on_button_clicked 方法 self.ui.pushButton.clicked.connect(self.on_button_clicked) def on_button_clicked(self): # 当按钮被点击时,执行此函数 self.ui.lineEdit.setText("你好,Python世界!") if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec()) -
运行程序:
python app.py
你将看到一个窗口,里面有按钮和文本框,点击按钮,文本框的内容会发生变化。
在运行时动态加载 .ui 文件
这种方法不预编译,而是在程序运行时读取并解析 .ui 文件,更灵活,但启动时会有轻微的性能开销。
-
直接使用
main_window.ui文件,无需转换。 -
编写主程序
app.py: 这次我们使用QUiLoader来动态加载。import sys from PySide6.QtWidgets import QApplication, QMainWindow from PySide6.QtUiTools import QUiLoader class MainWindow(QMainWindow): def __init__(self, ui_file): super().__init__() # 使用 QUiLoader 加载 .ui 文件 loader = QUiLoader() self.ui = loader.load(ui_file, self) if not self.ui: print("无法加载 UI 文件") sys.exit(-1) self.ui.setWindowTitle("动态加载示例") # --- 连接信号和槽 --- self.ui.pushButton.clicked.connect(self.on_button_clicked) def on_button_clicked(self): self.ui.lineEdit.setText("你好,动态加载!") if __name__ == "__main__": app = QApplication(sys.argv) # 指定 .ui 文件的路径 ui_file = "main_window.ui" window = MainWindow(ui_file) window.show() sys.exit(app.exec()) -
运行程序:
python app.py
效果与方法一完全相同。
总结与对比
| 特性 | Qt Designer | Python (PySide6) |
|---|---|---|
| 功能 | 可视化设计界面 | 实现业务逻辑、数据处理、事件响应 |
| 产出 | .ui (XML) 文件 |
.py (Python) 脚本 |
| 核心任务 | 拖拽控件、布局、设置属性 | 编写类、连接信号槽、编写槽函数 |
| 优点 | 直观、快速、关注点分离 | 强大、灵活、能实现任何复杂功能 |
| 关系 | 前端,负责“脸面” | 后端,负责“大脑” |
最佳实践:
- 始终使用 Qt Designer 设计界面,将设计师和程序员解放出来。
- 推荐使用
pyside6-uic进行预编译,将.ui转换为.py,以获得更好的性能。 - 在 Python 代码中,创建一个继承自
QMainWindow(或其他主窗口类) 的自定义类,将加载的 UI 对象作为该类的一个属性。 - 在类的
__init__方法中,完成所有信号和槽的连接。
通过这种方式,你可以构建出既美观又功能强大的桌面应用程序。
