[英]PyQt5 to PySide2, loading UI-Files in different classes
我有一个在 python3.6 下运行的 python 应用程序,并使用 PyQt5 加载 Ui 窗口。 这些窗口是用 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_())
PySide 不提供这些方法,但一种解决方案是通过将 PyQt5 的导入更改为 PySide2 来修改 PyQt uic 模块的源代码,法律条款不修改许可证,除了将保留 PyQt 许可证的代码.
为此,请从以下链接下载源代码并解压缩。
并执行以下脚本:
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_())
你可以在这里找到完整的例子
请按照以下简单步骤操作:
假设来自 qt 设计器的 ui 文件是 mycode.ui,通过键入不带引号的“pyside2-uic mycode.ui -o mycode.py”,使用 pyside2 ui 转换器将其转换为 py 文件。 (注意使用pyside2-uic的pyside2转换器而不是pyuic5的pyqt5转换器)
使用pyside2格式生成的mycode.py,只需将PyQt5代码的所有header替换为“import sys”和“from mycode import *”
你完成了...希望这会有所帮助
PySide2在 2020 年 5 月带回了 loadUiType 。 因此,如果您升级,则可以获得直接替换。 唯一的区别是导入:
from PySide2.QtUiTools import loadUiType
语法相同(您将使用loadUiType(<file>)[0]
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.