📜  将 PyQt5 应用程序迁移到 PySide2

📅  最后修改于: 2022-05-13 01:55:39.790000             🧑  作者: Mango

将 PyQt5 应用程序迁移到 PySide2


在Python中用于 Gui 开发的最先进的包之一是 PyQt5。根据 Pyside2 的维护者 Christian Tismer 的说法,PyQt5 有大约 25,000 个函数供您使用。那是一个非常大的图书馆。但是,如果您想在商业上分发您的应用程序,则需要从 Qt 公司购买许可证。幸运的是,PySide2 为您提供与 Free/Libre Software 相同的自由。

让我们看看如何将典型的 PyQt5 应用程序迁移到 PySide2。

import sys
from PyQt5.QtWidgets import (QGridLayout)
from PyQt5.QtWidgets import (QMainWindow)
from PyQt5.QtWidgets import (QApplication)
from PyQt5.QtWidgets import (
                                QWidget,
                                QPushButton,
                                QLabel,
                                QLineEdit
                            )
  
from PyQt5.QtCore import Qt
from PyQt5.QtGui import (QPixmap,QIcon)
  
  
class Window(QMainWindow):
  
    def __init__(self, parent = None):
        super().__init__(parent)
        self.setWindowTitle('PyQt5 Demo App')
        self.initGui()
  
  
    def initGui(self):
        self.layout = QGridLayout()
        self.window = QWidget()
        self.window.setLayout(self.layout)
        self.setCentralWidget(self.window)
  
        self.num1_label = QLabel('Enter first number:')
        self.num1_label.setAlignment(Qt.AlignCenter)
        self.text_box1 = QLineEdit()
        self.num2_label = QLabel('Enter second number:')
        self.text_box2 = QLineEdit()
          
        self.get_answer = QPushButton()
        calculate_icon = QPixmap('path_to_image.png')
        self.get_answer.setIcon(QIcon(calculate_icon))
          
        self.answer_label = QLabel('---')
  
        self.layout.addWidget(self.num1_label, 0, 0)
        self.layout.addWidget(self.text_box1, 1, 0)
        self.layout.addWidget(self.num2_label, 2, 0)
        self.layout.addWidget(self.text_box2, 3, 0)
        self.layout.addWidget(self.get_answer, 4, 0)
        self.layout.addWidget(self.answer_label, 5, 0)
  
  
if __name__ == '__main__':
    app = QApplication(sys.argv)
  
    win = Window()
    win.show()
  
    sys.exit(app.exec_())

输出:

我们特意使用了一个使用QtWidgetQtCoreQtGui的示例。要做的一件事是采取良好的做法。关于避免from X import * 。命名空间我们的导入具有了解什么属于什么模块的优势。

import sys
  
  
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5 import QtGui

现在,将我们的代码更改为以下我们命名导入的地方。 QMainWindow变成QtWidgets.QMainWindow等等——

class Window(QtWidgets.QMainWindow):
  
    def __init__(self, parent = None):
        super().__init__(parent)
        self.setWindowTitle('PyQt5 Demo App')
        self.initGui()
  
  
    def initGui(self):
        self.layout = QtWidgets.QGridLayout()
        self.window = QtWidgets.QWidget()
        self.window.setLayout(self.layout)
        self.setCentralWidget(self.window)
  
        self.num1_label = QtWidgets.QLabel('Enter first number:')
        self.num1_label.setAlignment(QtCore.Qt.AlignCenter)
        self.text_box1 = QtWidgets.QLineEdit()
        self.num2_label = QtWidgets.QLabel('Enter second number:')
        self.text_box2 = QtWidgets.QLineEdit()
          
        self.get_answer = QtWidgets.QPushButton()
        calculate_icon = QtGui.QPixmap('path_to_image.png')
        self.get_answer.setIcon(QtGui.QIcon(calculate_icon))
          
        self.answer_label = QtWidgets.QLabel('---')
  
        self.layout.addWidget(self.num1_label, 0, 0)
        self.layout.addWidget(self.text_box1, 1, 0)
        self.layout.addWidget(self.num2_label, 2, 0)
        self.layout.addWidget(self.text_box2, 3, 0)
        self.layout.addWidget(self.get_answer, 4, 0)
        self.layout.addWidget(self.answer_label, 5, 0)
  
  
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
  
    win = Window()
    win.show()
  
    sys.exit(app.exec_())

转换为 Pyside2

将我们的应用程序转换为 PySide2 就像将我们的导入更改为

import sys
  
  
from PySide2 import QtWidgets
from PySide2 import QtCore
from PySide2 import QtGui

需要注意的注意事项——

对于大多数用途,迁移意味着调整导入、定义函数和仅使用支持的函数。

  1. 需要注意的一件事是app.exec_exec_被用作exec是 Python2 关键字。在 Python3 下,PyQt5 允许使用exec但不允许使用 PySide2。 PyQt5 支持sys.exit(app.exec_())sys.exit(app.exec())但 PySide2 仅支持 app.exec_ app.exec_()
  2. 第二件事是信号和插槽。在 PyQt5 下是QtCore.pyqtSignalQtCore.pyqtSlot ,在 PySide2 下是QtCore.SignalQtCore.Slot
  3. 第三件事是加载 Ui 文件。