11.4 图形化界面

PySide6 是 Qt 公司官方支持的 Python 绑定库,用于开发跨平台的图形用户界面(GUI)应用程序。它继承自 Qt 框架的强大功能,提供了丰富的界面组件和工具,支持 Windows、macOS、Linux 等多个平台,是 Python 中构建专业 GUI 应用的优选库之一。

核心优势

  • 跨平台兼容:一次编写,在不同操作系统上运行,界面风格自动适配系统原生样式
  • 丰富的组件库:包含按钮、文本框、表格、图表、对话框等数百种界面元素
  • 强大的功能:支持多线程、网络编程、数据库交互、多媒体处理等
  • 可视化设计工具:可配合 Qt Designer 快速设计界面,提高开发效率
  • 活跃的社区支持:作为 Qt 官方绑定,文档完善且更新及时

安装

pip install pyside6

核心组件与概念

  • QApplication:应用程序的主对象,管理应用的生命周期和资源
  • QMainWindow:主窗口组件,包含菜单栏、工具栏、状态栏等
  • Widgets:界面元素(如按钮 QPushButton、标签 QLabel、文本框 QLineEdit 等)
  • Layouts:布局管理器(如 QVBoxLayout 垂直布局、QHBoxLayout 水平布局),用于自动排列组件
  • 信号与槽(Signals & Slots):Qt 特有的事件处理机制,用于组件间通信(如按钮点击信号连接到处理函数),实现主窗口与对话框的数据传递。

示例

import sys
from PySide6.QtWidgets import (
    QApplication,
    QMainWindow,
    QPushButton,
    QVBoxLayout,
    QWidget,
    QLabel
)
from PySide6.QtCore import Slot, Qt  # 新增导入Qt


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # 设置窗口标题和大小
        self.setWindowTitle("PySide6 示例")
        self.setGeometry(100, 100, 400, 300)  # x, y, 宽度, 高度

        # 创建中心部件和布局
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout(central_widget)

        # 添加标签
        self.label = QLabel("请点击按钮", alignment=Qt.AlignCenter)
        layout.addWidget(self.label)

        # 添加按钮
        self.button = QPushButton("点击我")
        # 连接按钮点击事件到槽函数
        self.button.clicked.connect(self.on_button_clicked)
        layout.addWidget(self.button)

        # 添加第二个按钮
        self.count_button = QPushButton("计数")
        self.count_button.clicked.connect(self.on_count_clicked)
        self.count_button.setEnabled(False)
        layout.addWidget(self.count_button)

        self.counter = 0  # 计数变量

    @Slot()  # 标记为槽函数
    def on_button_clicked(self):
        """按钮点击事件处理"""
        self.label.setText("按钮被点击了!")
        # 改变按钮状态
        self.button.setEnabled(False)
        self.count_button.setEnabled(True)

    @Slot()
    def on_count_clicked(self):
        """计数按钮事件处理"""
        self.counter += 1
        self.label.setText(f"计数: {self.counter}")
        if self.counter >= 5:
            self.count_button.setText("重置")
        if self.counter >= 10:
            self.counter = 0
            self.count_button.setText("计数")
            self.button.setEnabled(True)


if __name__ == "__main__":
    # 创建应用实例
    app = QApplication(sys.argv)

    # 创建并显示窗口
    window = MainWindow()
    window.show()

    # 进入应用主循环
    sys.exit(app.exec())