簡體   English   中英

PyQt5 到 PySide2,在不同的類中加載 UI 文件

[英]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_())

你可以在這里找到完整的例子

請按照以下簡單步驟操作:

  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代碼的所有header替換為“import sys”和“from mycode import *”

  3. 你完成了...希望這會有所幫助

PySide2在 2020 年 5 月帶回了 loadUiType 因此,如果您升級,則可以獲得直接替換。 唯一的區別是導入:

from PySide2.QtUiTools import loadUiType

語法相同(您將使用loadUiType(<file>)[0]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM