杰瑞科技汇

Python与Qt如何快速开发GUI应用?

为什么选择 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,主要有三种方式,理解它们的区别很重要:

Python与Qt如何快速开发GUI应用?-图1
(图片来源网络,侵删)
  1. 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 官方同步更新,并且是免费的。
  2. PyQt / PySide 的两种 API 风格

    • 命令式 API:在 Python 代码中直接创建和布局所有控件,这种方式代码量稍多,但逻辑清晰,易于理解。
    • 声明式 API (QML):使用一种名为 QML (Qt Modeling Language) 的标记语言来描述 UI 界面,类似于网页开发中的 HTML,Python 代码作为后端逻辑与 QML 前端进行交互,这种方式非常适合创建动画丰富、现代化的用户界面,但需要学习新的语言。

本教程将重点介绍使用 PySide6 的命令式 API,因为它最适合初学者和大多数传统桌面应用。


环境搭建

你需要安装 Python 和 PySide6。

Python与Qt如何快速开发GUI应用?-图2
(图片来源网络,侵删)

安装 Python 确保你的系统已经安装了 Python 3.6 或更高版本,你可以在终端或命令提示符中运行 python --version 来检查。

安装 PySide6 打开终端或命令提示符,使用 pip 进行安装:

pip install PySide6

这个命令会自动安装 PySide6 及其所有依赖项。


第一个 Qt 应用程序:Hello World

让我们从一个最简单的窗口开始。

Python与Qt如何快速开发GUI应用?-图3
(图片来源网络,侵删)

代码 (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())

代码解析

  1. QApplication:这是 Qt 应用程序的核心,它管理应用程序的事件循环、设置和样式,任何有 GUI 的 Qt 程序都必须创建一个 QApplication 实例。sys.argv 使程序能够接收命令行参数。
  2. QMainWindow:这是一个主窗口类,提供了应用程序主窗口的基本框架,包括菜单栏、工具栏、状态栏和中心部件。
  3. MainWindow:我们通过继承 QMainWindow 来创建自己的窗口,这是面向对象编程的体现。
  4. __init__:构造函数。super().__init__() 调用了父类的构造函数,这是必须的。
  5. setWindowTitlesetGeometry:这些是 QMainWindow 提供的方法,用于设置窗口的标题和位置/大小。
  6. window.show():创建窗口后,它默认是隐藏的,必须调用 show() 方法才能将其显示在屏幕上。
  7. 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())

代码解析

  1. QWidgetQMainWindow 的中心部分需要一个通用的控件容器,QWidget 就是最常用的选择。
  2. setCentralWidget(central_widget):将我们创建的 central_widget 设置为主窗口的中心部件。
  3. QVBoxLayout:垂直布局管理器,它会将所有添加的控件垂直排列,Qt 还提供 QHBoxLayout(水平布局)、QGridLayout(网格布局)等。
  4. QLabel:用于显示文本或图像的标签控件。
  5. QPushButton:按钮控件。
  6. addWidget():将控件添加到布局中。
  7. 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:设计界面

  1. 选择 "Main Window" 或 "Dialog" 作为模板,点击 "Create"。
  2. 从左侧的 "Widget Box" 中拖拽你需要的控件到画布上(一个 QLineEdit,一个 QPushButton,一个 QTextEdit)。
  3. 使用右侧的 "Property Editor" 修改控件的属性(如 objectName, text, placeholderText 等)。
  4. 使用 "Lays" 工具栏来布局你的控件,使界面看起来整洁。
  5. 设计完成后,点击 "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 比手写代码快得多,也更容易实现复杂的布局。

总结与学习路径

  1. 基础掌握:理解 QApplication, QWidget, QMainWindow, 布局管理器 (QVBoxLayout 等) 和信号/槽机制,这是构建任何 Qt 应用的基石。
  2. 熟悉常用控件:学习 QLabel, QPushButton, QLineEdit, QTextEdit, QListWidget, QTableWidget 等常用控件的使用方法。
  3. 拥抱 Qt Designer:养成使用 Qt Designer 设计 UI 的习惯,这是专业开发的标准流程。
  4. 探索高级主题
    • 自定义控件:通过继承现有控件来创建自己的组件。
    • 多线程:使用 QThread 将耗时任务(如网络请求、文件处理)放到后台线程,避免界面卡顿。
    • 模型/视图:Qt 提供了一套强大的数据管理框架,用于高效地展示和编辑复杂数据(如表格、树形结构)。
    • 数据库集成:使用 QtSql 模块与各种数据库进行交互。

推荐资源

  • 官方文档PySide6 Documentation (最权威、最全面)
  • Qt 官方示例:文档中包含了大量可运行的示例代码,是学习特定功能的最佳途径。
  • 书籍:《PySide6 in Action》等。

希望这个详细的指南能帮助你顺利开启 Python + Qt 的 GUI 编程之旅!

分享:
扫描分享到社交APP
上一篇
下一篇