为什么选择 Python + Qt?
- Python 的优势:语法简洁、上手快、拥有庞大的生态系统(NumPy, Pandas, Matplotlib 等),可以快速实现复杂的业务逻辑。
- Qt 的优势:
- 功能强大:提供几乎所有的 GUI 组件(按钮、窗口、菜单、表格、绘图等)以及高级功能(多线程、网络、数据库、3D 图形)。
- 跨平台:一套代码可以编译运行在 Windows, macOS, Linux 等多种操作系统上。
- 成熟稳定:Qt 是一个超过 25 年历史的框架,被无数大型项目(如 K Desktop Environment, VLC, Autodesk Maya)所使用。
- 优秀的工具:Qt Designer 可以通过拖拽的方式设计 UI 界面,极大地提高了开发效率。
核心概念:Qt 的三种编程方式
在 Python 中使用 Qt,主要有三种方式,理解它们的区别很重要:

-
PyQt / PySide:这是最主流的方式,它们是 Python 对 Qt C++ 库的封装。
- PyQt:由 Riverbank Computing 公司开发,有两个版本:PyQt5(对应 Qt5)和 PyQt6(对应 Qt6),商业使用需要购买许可证。
- PySide:由 Qt 官方公司(The Qt Company)开发,也有两个版本:PySide2(对应 Qt5)和 PySide6(对应 Qt6),完全开源和免费,是 Qt 官方推荐的 Python 绑定。
- 选择建议:对于新项目,强烈推荐使用 PySide6,因为它与 Qt 官方同步更新,并且是免费的。
-
PyQt / PySide 的两种 API 风格:
- 命令式 API:在 Python 代码中直接创建和布局所有控件,这种方式代码量稍多,但逻辑清晰,易于理解。
- 声明式 API (QML):使用一种名为 QML (Qt Modeling Language) 的标记语言来描述 UI 界面,类似于网页开发中的 HTML,Python 代码作为后端逻辑与 QML 前端进行交互,这种方式非常适合创建动画丰富、现代化的用户界面,但需要学习新的语言。
本教程将重点介绍使用 PySide6 的命令式 API,因为它最适合初学者和大多数传统桌面应用。
环境搭建
你需要安装 Python 和 PySide6。

安装 Python
确保你的系统已经安装了 Python 3.6 或更高版本,你可以在终端或命令提示符中运行 python --version 来检查。
安装 PySide6 打开终端或命令提示符,使用 pip 进行安装:
pip install PySide6
这个命令会自动安装 PySide6 及其所有依赖项。
第一个 Qt 应用程序:Hello World
让我们从一个最简单的窗口开始。

代码 (hello_window.py)
import sys
from PySide6.QtWidgets import QApplication, QMainWindow
# 1. 创建一个自定义的窗口类,继承自 QMainWindow
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 2. 设置窗口属性
self.setWindowTitle("我的第一个 Qt 窗口")
self.setGeometry(300, 300, 400, 200) # x, y, width, height
self.setMinimumSize(300, 150) # 设置最小窗口尺寸
# 3. 应用程序的主入口
if __name__ == "__main__":
# a. 创建 QApplication 实例,每个 Qt 程序必须有且只有一个 QApplication。
app = QApplication(sys.argv)
# b. 创建我们自定义的窗口实例
window = MainWindow()
# c. 显示窗口
window.show()
# d. 运行应用程序的事件循环,并确保程序正常退出
sys.exit(app.exec())
代码解析:
QApplication:这是 Qt 应用程序的核心,它管理应用程序的事件循环、设置和样式,任何有 GUI 的 Qt 程序都必须创建一个QApplication实例。sys.argv使程序能够接收命令行参数。QMainWindow:这是一个主窗口类,提供了应用程序主窗口的基本框架,包括菜单栏、工具栏、状态栏和中心部件。MainWindow类:我们通过继承QMainWindow来创建自己的窗口,这是面向对象编程的体现。__init__:构造函数。super().__init__()调用了父类的构造函数,这是必须的。setWindowTitle和setGeometry:这些是QMainWindow提供的方法,用于设置窗口的标题和位置/大小。window.show():创建窗口后,它默认是隐藏的,必须调用show()方法才能将其显示在屏幕上。app.exec():这行代码启动了 Qt 的事件循环,程序会在这里等待用户操作(如点击鼠标、按下键盘),并根据这些操作执行相应的代码。sys.exit()确保在程序退出时能正确地清理资源。
运行这个脚本,你将看到一个简单的窗口。
添加控件与布局
的窗口没什么用,现在我们来添加一个按钮和一些文本,并使用布局管理器来排列它们。
代码 (hello_widgets.py)
import sys
from PySide6.QtWidgets import (
QApplication, QMainWindow, QWidget, QVBoxLayout,
QPushButton, QLabel
)
# 1. 创建自定义窗口类
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("带控件的窗口")
self.setGeometry(300, 300, 500, 400)
# 2. 创建一个中心部件和布局
# QMainWindow 需要一个中心部件来放置其他控件
central_widget = QWidget()
self.setCentralWidget(central_widget)
# 创建一个垂直布局
layout = QVBoxLayout()
# 3. 创建控件
self.label = QLabel("你好,PySide6!")
self.label.setAlignment(Qt.AlignmentFlag.AlignCenter) # 文本居中
self.button = QPushButton("点击我")
# 4. 将控件添加到布局中
layout.addWidget(self.label)
layout.addWidget(self.button)
# 5. 将布局应用到中心部件
central_widget.setLayout(layout)
# 6. 主入口
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
代码解析:
QWidget:QMainWindow的中心部分需要一个通用的控件容器,QWidget就是最常用的选择。setCentralWidget(central_widget):将我们创建的central_widget设置为主窗口的中心部件。QVBoxLayout:垂直布局管理器,它会将所有添加的控件垂直排列,Qt 还提供QHBoxLayout(水平布局)、QGridLayout(网格布局)等。QLabel:用于显示文本或图像的标签控件。QPushButton:按钮控件。addWidget():将控件添加到布局中。setLayout(layout):将最终的布局应用到central_widget上。
运行后,你会看到一个垂直排列的标签和按钮。
事件处理:让控件“活”起来
控件本身不会做任何事,我们需要为它们编写“槽函数”(Slot)来响应事件(如按钮点击)。
代码 (hello_events.py)
import sys
from PySide6.QtWidgets import (
QApplication, QMainWindow, QWidget, QVBoxLayout,
QPushButton, QLabel
)
from PySide6.QtCore import Qt
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("事件处理")
self.setGeometry(300, 300, 500, 400)
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QVBoxLayout()
self.label = QLabel("初始文本")
self.label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.button = QPushButton("点击改变文本")
# 将按钮的 "clicked" 信号连接到我们的 on_button_clicked 槽函数
self.button.clicked.connect(self.on_button_clicked)
layout.addWidget(self.label)
layout.addWidget(self.button)
central_widget.setLayout(layout)
# 这是一个槽函数,用于响应按钮点击事件
def on_button_clicked(self):
print("按钮被点击了!")
self.label.setText("文本已被改变!")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
核心概念:信号和槽
- 信号:由对象在特定事件发生时发出的通知,按钮被点击时会发出
clicked信号。 - 槽:一个可以接收信号并执行相应操作的函数,我们的
on_button_clicked就是一个槽。 connect():将信号和槽连接起来,当信号发出时,与之连接的槽函数就会被自动调用。
当你点击按钮时,控制台会打印 "按钮被点击了!",同时窗口中的标签文本会更新为 "文本已被改变!",这就是 GUI 编程的核心交互模式。
进阶:使用 Qt Designer 设计 UI
手动编写所有 UI 布局代码很繁琐,Qt Designer 是一个可视化的 UI 设计工具,可以帮你完成这部分工作。
步骤 1:打开 Qt Designer
如果你通过 pip 安装了 PySide6,通常可以在命令行运行 pyside6-designer 来启动它。
步骤 2:设计界面
- 选择 "Main Window" 或 "Dialog" 作为模板,点击 "Create"。
- 从左侧的 "Widget Box" 中拖拽你需要的控件到画布上(一个
QLineEdit,一个QPushButton,一个QTextEdit)。 - 使用右侧的 "Property Editor" 修改控件的属性(如 objectName, text, placeholderText 等)。
- 使用 "Lays" 工具栏来布局你的控件,使界面看起来整洁。
- 设计完成后,点击 "File" -> "Save As",将文件保存为
.ui格式,my_ui.ui。
步骤 3:将 .ui 文件转换为 Python 代码
Qt Designer 生成的 .ui 文件是 XML 格式的,Python 无法直接读取,我们需要使用 pyside6-uic 工具将其转换为 Python 代码。
在终端中运行:
pyside6-uic my_ui.ui -o my_ui.py
这会生成一个名为 my_ui.py 的文件,里面包含了一个 Ui_MainWindow 类。
步骤 4:在程序中使用生成的 UI
你可以在你的主程序中导入并使用这个 Ui_MainWindow 类。
代码 (main_app.py)
import sys
from PySide6.QtWidgets import QApplication, QMainWindow
# 导入由 Qt Designer 生成的 UI 类
from my_ui import Ui_MainWindow
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 创建并设置 UI
self.ui = Ui_MainWindow()
self.ui.setupUi(self) # 这行代码会自动加载所有控件并设置布局
# 现在你可以像访问普通属性一样访问 UI 中的控件
# 如果按钮的 objectName 是 "pushButton"
self.ui.pushButton.clicked.connect(self.on_button_clicked)
def on_button_clicked(self):
input_text = self.ui.lineEdit.text()
self.ui.textEdit.append(f"你说: {input_text}")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
这种方式的优势:
- 关注点分离:UI 设计(
.ui文件)和业务逻辑(.py文件)是分开的,使得代码更清晰,易于维护。 - 高效:拖拽设计 UI 比手写代码快得多,也更容易实现复杂的布局。
总结与学习路径
- 基础掌握:理解
QApplication,QWidget,QMainWindow, 布局管理器 (QVBoxLayout等) 和信号/槽机制,这是构建任何 Qt 应用的基石。 - 熟悉常用控件:学习
QLabel,QPushButton,QLineEdit,QTextEdit,QListWidget,QTableWidget等常用控件的使用方法。 - 拥抱 Qt Designer:养成使用 Qt Designer 设计 UI 的习惯,这是专业开发的标准流程。
- 探索高级主题:
- 自定义控件:通过继承现有控件来创建自己的组件。
- 多线程:使用
QThread将耗时任务(如网络请求、文件处理)放到后台线程,避免界面卡顿。 - 模型/视图:Qt 提供了一套强大的数据管理框架,用于高效地展示和编辑复杂数据(如表格、树形结构)。
- 数据库集成:使用
QtSql模块与各种数据库进行交互。
推荐资源:
- 官方文档:PySide6 Documentation (最权威、最全面)
- Qt 官方示例:文档中包含了大量可运行的示例代码,是学习特定功能的最佳途径。
- 书籍:《PySide6 in Action》等。
希望这个详细的指南能帮助你顺利开启 Python + Qt 的 GUI 编程之旅!
