3
votes

PyQt5 à PySide2, chargement de fichiers UI dans différentes classes

J'ai une application python qui fonctionne sous python3.6 et utilise PyQt5 pour charger les fenêtres de l'interface utilisateur. Ces fenêtres ont été créées avec Qt Designer 5.9.4. Le code ci-dessous montre un exemple de travail avec PyQt5.

Maintenant, je veux avoir exactement la même fonctionnalité mais avec PySide2. Pour l'instant, je ne pouvais pas trouver comment charger un fichier Ui et utiliser ses objets (boutons, tables, etc.) dans une classe distincte. Par exemple: en cliquant sur un bouton dans la première fenêtre / classe, une deuxième fenêtre apparaît quelles fonctions sont définies dans une classe séparée, voir exemple. Tous les exemples que j'ai trouvés, chargez simplement une fenêtre d'interface utilisateur, mais ne montrez pas comment l'utiliser. Quelqu'un peut-il aider?

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


2 commentaires

Non, j'ai besoin d'un exemple de code qui fait les choses ci-dessus mais qui est basé sur PySide2.


Il semble que PySide n'ait pas de fonction loadUiType, mais vous pouvez essayer celle-ci: stackoverflow.com/a/14195313/154762 ou voir les autres réponses à cette question pour des alternatives.


3 Réponses :


2
votes

PySide ne propose pas ces méthodes, mais une solution est de modifier le code source du module uic PyQt en changeant les importations de PyQt5 vers PySide2, pour les termes légaux ne modifiez pas la licence, en plus du code qui le conservera les licences PyQt.

Pour ce faire, téléchargez le code source à partir du lien a > et décompressez-le.

Et exécutez le script suivant:

convert_pyqt5_to_pyside2.py

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

En utilisant la commande suivante:

python convert_pyqt5_to_pyside2.py -i /path/of/PyQt5-folder -o fakeuic

Ensuite, vous pouvez utiliser la méthode loadUiType de fakeuic:

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

Vous pouvez trouver le exemple ici


2 commentaires

Si tout ce que vous faites est de remplacer PyQt5 par PySide2, alors find. -nom '* .py' | xargs sed 's / PyQt5 / PySide2 / g' -i.bpk suffirait


@geckos c'est vrai, mais si la commande find est installée, et pour les utilisateurs de Windows, cela peut être un problème.



0
votes

Suivez ces étapes simples:

  1. En supposant que le fichier ui de qt designer est mycode.ui, convertissez-le en fichier py en utilisant le convertisseur pyside2 ui en tapant "pyside2-uic mycode.ui -o mycode.py" sans les guillemets. (Notez utiliser le convertisseur pyside2 de pyside2-uic et non le convertisseur pyqt5 de pyuic5)

  2. Avec mycode.py généré par le format pyside2, remplacez simplement tous les en-têtes du code PyQt5 par "import sys" et "from mycode import *"

  3. Vous avez terminé ... J'espère que cela vous aidera


0 commentaires

0
votes

PySide2 a ramené loadUiType en mai 2020 . Donc, si vous mettez à jour, vous pouvez obtenir un remplacement instantané. La seule différence est l'importation:

from PySide2.QtUiTools import loadUiType

La syntaxe est la même (vous utiliserez loadUiType () [0] )

p >


0 commentaires