Python PyQt5到PySide2,加载不同类中的UI文件

Python PyQt5到PySide2,加载不同类中的UI文件,python,pyqt5,qt-designer,pyside2,Python,Pyqt5,Qt Designer,Pyside2,我有一个python应用程序,它在python3.6下运行,并使用PyQt5加载Ui窗口。这些窗口是使用Qt Designer 5.9.4创建的。下面的代码显示了PyQt5的工作示例 现在我想拥有与PySide2完全相同的功能。目前,我还不知道如何在单独的类中加载Ui文件并使用其对象(按钮、表格等)。例如:通过单击第一个窗口/类中的按钮,第二个窗口显示在单独类中定义的函数,请参见示例。我找到的所有示例都只是加载一个Ui窗口,但没有显示如何使用它。有人能帮忙吗 #!/usr/bin/env pyt

我有一个python应用程序,它在python3.6下运行,并使用PyQt5加载Ui窗口。这些窗口是使用Qt Designer 5.9.4创建的。下面的代码显示了PyQt5的工作示例

现在我想拥有与PySide2完全相同的功能。目前,我还不知道如何在单独的类中加载Ui文件并使用其对象(按钮、表格等)。例如:通过单击第一个窗口/类中的按钮,第二个窗口显示在单独类中定义的函数,请参见示例。我找到的所有示例都只是加载一个Ui窗口,但没有显示如何使用它。有人能帮忙吗

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from PyQt5.uic import loadUiType  
from PyQt5 import QtGui, QtCore

Ui_FirstWindow, QFirstWindow = loadUiType('first_window.ui')
Ui_SecondWindow, QSecondWindow = loadUiType('second_window.ui')


class First(Ui_FirstWindow, QFirstWindow):

    def __init__(self):  
        super(First, self).__init__()
        self.setupUi(self)

        self.button.clicked.connect(self.show_second_window)

    def show_second_window(self):

        self.Second = Second()
        self.Second.show()


class Second(Ui_SecondWindow, QSecondWindow):

    def __init__(self):  
        super(Second, self).__init__()
        self.setupUi(self)


if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)

    main = First()
    main.show()

    sys.exit(app.exec_())

PySide不提供这些方法,但一种解决方案是通过将导入从PyQt5更改为PySide2来修改PyQt uic模块的源代码,因为法律条款除了保留PyQt许可证的代码外,不修改许可证

为此,请从以下站点下载源代码并解压缩

并执行以下脚本:

将_pyqt5_转换为_pyside2.py

import os
import fileinput
import argparse
import shutil

def modify_source_code(directory, text_to_search, replacement_text):
    for path, subdirs, files in os.walk(directory):
        for name in files:
            filename = os.path.join(path, name)
            with fileinput.FileInput(filename, inplace=True) as file:
                for line in file:
                    if line.startswith('#'):
                        # not change on comments
                        print(line, end='')
                    else:
                        print(line.replace(text_to_search, replacement_text), end='')

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("-i", "--input", help="Input directory")
    parser.add_argument("-o", "--output", help="Output directory")
    args = parser.parse_args()
    if args.input and args.output:
        input_dir = os.path.join(os.path.abspath(args.input), "pyuic", "uic")
        output_dir = os.path.abspath(args.output)
        shutil.copytree(input_dir, output_dir)
        modify_source_code(output_dir, 'PyQt5', 'PySide2')

if __name__ == '__main__':
    main()
使用以下命令:

python convert_pyqt5_to_pyside2.py -i /path/of/PyQt5-folder -o fakeuic
然后可以使用fakeuic中的loadUiType方法:

from fakeuic import loadUiType  
from PySide2 import QtCore, QtGui, QtWidgets

Ui_FirstWindow, QFirstWindow = loadUiType('first_window.ui')
Ui_SecondWindow, QSecondWindow = loadUiType('second_window.ui')

class First(QFirstWindow, Ui_FirstWindow):
    def __init__(self):  
        super(First, self).__init__()
        self.setupUi(self)
        self.button.clicked.connect(self.show_second_window)

    def show_second_window(self):
        self.Second = Second()
        self.Second.show()

class Second(QSecondWindow, Ui_SecondWindow):
    def __init__(self):  
        super(Second, self).__init__()
        self.setupUi(self)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    main = First()
    main.show()
    sys.exit(app.exec_())

您可以通过以下简单步骤找到完整的示例:

  • 假设来自qt designer的ui文件是mycode.ui,通过键入不带引号的“pyside2 uic mycode.ui-o mycode.py”,使用pyside2 ui转换器将其转换为py文件。(注意使用pyside2 uic的pyside2转换器,而不是pyuic5的pyqt5转换器)

  • 使用pyside2格式生成的mycode.py,只需将PyQt5代码的所有头替换为“import sys”和“from mycode import*”

  • 你完成了…希望这有帮助

  • PySide2。因此,如果你升级,你可以得到一个下降的替代品。唯一的区别是导入:

    from PySide2.QtUiTools import loadUiType
    

    语法是相同的(您将使用
    loadUiType()[0]

    不,我需要的是一个代码示例,它可以完成上述操作,但基于PySide2。PySide似乎没有loadUiType函数,但是你可以试试这个:或者看看这个问题的其他答案,如果你所做的一切都是用PySide2替换PyQt5,那么
    find-名称'*.py'| xargs sed's/PyQt5/PySide2/g'-i.bpk
    suffice@geckos确实如此,但是如果您安装了
    find
    命令,并且对于windows用户来说,这可能是一个问题。