当前位置: 首页 > news >正文

PyQt5 到 PySide6 技术栈转换详解

PyQt5 到 PySide6 技术栈转换详解

本项目最初使用 PyQt5 构建图形用户界面 (all_sensors_reader.py)。为了探索不同的 Qt for Python 绑定库,并利用 PySide6 可能带来的一些优势(例如更宽松的 LGPL 许可证),我们创建了一个功能相同但基于 PySide6 的版本 (all_sensors_reader_pyside.py)。
在这里插入图片描述

本文档详细介绍了从 PyQt5 迁移到 PySide6 的主要差异和修改点,并以本项目中的代码为例进行说明。

1. 包导入 (Package Imports)

最明显的变化是包名需从 PyQt5 替换为 PySide6

PyQt5 (all_sensors_reader.py):

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,QHBoxLayout, QLabel, QPushButton, QComboBox,QGroupBox, QGridLayout, QTableWidget, QTableWidgetItem,QHeaderView, QMessageBox, QSplitter)
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QFont
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

PySide6 (all_sensors_reader_pyside.py):

import sys
from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,QHBoxLayout, QLabel, QPushButton, QComboBox,QGroupBox, QGridLayout, QTableWidget, QTableWidgetItem,QHeaderView, QMessageBox, QSplitter)
from PySide6.QtCore import Qt, QTimer, Slot
from PySide6.QtGui import QFont
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas

主要修改: 将所有 PyQt5 替换为 PySide6,并根据需要导入 Slot

2. 信号和槽 (Signals and Slots)

信号连接方式在两者中一致,但 PySide6 推荐使用 @Slot() 装饰器标记槽函数,以提高可读性和类型安全性。

PyQt5 (all_sensors_reader.py):

class AllSensorsApp(QMainWindow):def __init__(self):self.refresh_button.clicked.connect(self.refresh_ports)self.connect_button.clicked.connect(self.connect_device)self.disconnect_button.clicked.connect(self.disconnect_device)self.auto_refresh_combo.currentIndexChanged.connect(self.set_auto_refresh)self.manual_refresh_button.clicked.connect(self.update_data)def refresh_ports(self):passdef connect_device(self):passdef set_auto_refresh(self, index):passdef update_data(self):pass

PySide6 (all_sensors_reader_pyside.py):

from PySide6.QtCore import Slotclass AllSensorsApp(QMainWindow):def __init__(self):self.refresh_button.clicked.connect(self.refresh_ports)self.connect_button.clicked.connect(self.connect_device)self.disconnect_button.clicked.connect(self.disconnect_device)self.auto_refresh_combo.currentIndexChanged.connect(self.set_auto_refresh)self.manual_refresh_button.clicked.connect(self.update_data)@Slot()def refresh_ports(self):pass@Slot()def connect_device(self):pass@Slot(int)def set_auto_refresh(self, index):pass@Slot()def update_data(self):pass

主要修改: 添加 @Slot() 装饰器,并为需要参数的槽函数指定类型(如 @Slot(int))。

3. 枚举 (Enums)

PySide6 对枚举访问路径要求更明确。

PyQt5 (all_sensors_reader.py):

splitter = QSplitter(Qt.Horizontal)
self.telemetry_table.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
self.telemetry_table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
self.telemetry_table.setEditTriggers(QTableWidget.NoEditTriggers)

PySide6 (all_sensors_reader_pyside.py):

splitter = QSplitter(Qt.Orientation.Horizontal)
self.telemetry_table.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeMode.Stretch)
self.telemetry_table.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeMode.Stretch)
self.telemetry_table.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers)

主要修改:

  • Qt.Horizontal -> Qt.Orientation.Horizontal
  • QHeaderView.Stretch -> QHeaderView.ResizeMode.Stretch
  • QTableWidget.NoEditTriggers -> QTableWidget.EditTrigger.NoEditTriggers

4. Matplotlib 后端 (Matplotlib Backend)

Matplotlib 后端需调整以兼容 PySide6。

PyQt5 (all_sensors_reader.py):

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

PySide6 (all_sensors_reader_pyside.py):

from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas

主要修改: 使用通用后端 backend_qtagg,兼容多种 Qt 绑定。

5. 应用程序执行 (exec_() vs exec())

主事件循环方法名有所不同。

PyQt5 (all_sensors_reader.py):

if __name__ == '__main__':app = QApplication(sys.argv)mainWin = AllSensorsApp()mainWin.show()sys.exit(app.exec_())

PySide6 (all_sensors_reader_pyside.py):

def main_gui():app = QApplication(sys.argv)mainWin = AllSensorsApp()mainWin.show()sys.exit(app.exec())if __name__ == '__main__':main_gui()

主要修改: app.exec_() 改为 app.exec(),符合 Python 3 的命名规范。

总结

从 PyQt5 到 PySide6 的迁移主要涉及包名替换、信号槽装饰器调整、枚举路径更新、Matplotlib 后端更换及 exec() 方法修改。两者的功能和性能差异不大,PySide6 的 LGPL 许可证为其在商业场景中提供了优势。

相关文章:

  • ICMP协议
  • 组网技术知识点
  • Attention层的FLOPs计算
  • C语言发展史:从Unix起源到现代标准演进
  • finebi使用资源迁移无法导入资源,解决方法
  • 编译faiss
  • Multicore-TSNE
  • ROS2与Carla安装设备(其三)测试 ROS 2
  • 基于 Rancher 部署 Kubernetes 集群的工程实践指南
  • STM32实现simpleFOC控制无刷电机
  • 基于C++的IOT网关和平台4:github项目ctGateway交互协议
  • 张正友相机标定算法(Zhang’s camera calibration method)原理和过程推导(附OpenCV代码示例)
  • QT6 源(63)篇六:阅读与注释 QString 这个类,包含了 QString 类的 完整源码,也附上 QLatin1String 类的
  • Linux C++ xercesc xml 怎么判断路径下有没有对应的节点
  • Arduino项目实战与编程技术详解
  • LangChain的向量RAG与MCP在意图识别的主要区别
  • 离轴干涉系统 | 赋能超表面性能精准检测
  • Java批量数据处理唯一ID生成优化
  • WPF之TextBox控件详解
  • LeRobot 项目部署运行逻辑(三)——机器人及舵机配置
  • 中国人民解放军南部战区位南海海域进行例行巡航
  • 贵州茅台一季度净利268亿元增长11.56%,系列酒营收增近两成
  • 83岁连丽如每周登台说书,还上了15堂连派评书课
  • 财政部农业农村司司长吴奇修接受纪律审查和监察调查
  • 马上评丨市长信箱“已读乱回”,群众在意的是什么
  • 美乌总统梵蒂冈会谈,外交部:望有关各方继续通过对话谈判解决危机