PyQt5 в PySide2, загрузка UI-файлов в разных классах - PullRequest
3 голосов
/ 19 марта 2019

У меня есть приложение на python, которое работает под python3.6 и использует PyQt5 для загрузки окон пользовательского интерфейса. Эти окна были созданы с помощью 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_())

1 Ответ

1 голос
/ 20 марта 2019

PySide не предлагает эти методы, но одно решение состоит в том, чтобы изменить исходный код модуля PyQt uic, изменив импорт с PyQt5 на PySide2, для юридических условий не изменяйте лицензию, в дополнение к коду, который будет сохранять лицензии 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

Затем вы можете использовать метод loadUiType из fakeuic:

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

Вы можете найти полный пример здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...