【问题标题】:PyQt5 to PySide2, loading UI-Files in different classesPyQt5 到 PySide2,在不同的类中加载 UI 文件
【发布时间】:2019-08-10 00:26:32
【问题描述】:

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

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

#!/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_())

【问题讨论】:

  • 不,我需要的是一个基于 PySide2 的代码示例。
  • PySide 似乎没有 loadUiType 函数,但您可以试试这个:stackoverflow.com/a/14195313/154762 或查看该问题中的其他答案以获取替代方案。

标签: python pyqt5 qt-designer pyside2


【解决方案1】:

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

为此,请从以下link 下载源代码并解压缩。

并执行以下脚本:

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

你可以找到完整的例子here

【讨论】:

  • 如果你所做的一切都是用 PySide2 替换 PyQt5,那么 find . -name '*.py' | xargs sed 's/PyQt5/PySide2/g' -i.bpk 就足够了
  • @geckos 确实如此,但如果您安装了find 命令,并且对于 Windows 用户来说这可能是个问题。
【解决方案2】:

遵循这些简单的步骤:

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

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

  3. 你已经完成了......希望这会有所帮助

【讨论】:

    【解决方案3】:

    PySide2 brought back loadUiType in May 2020。因此,如果您升级,您可以获得替代品。唯一的区别是导入:

    from PySide2.QtUiTools import loadUiType
    

    语法相同(你将使用loadUiType(<file>)[0]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多