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