Quel est l'avantage de la conversion d'un fichier d'interface utilisateur pour le code Python vs de le charger directement? [dupliquer]

0

La question

Est-il un avantage à:

Convertir en python pyside6-uic mainwindow.ui > ui_mainwindow.py et puis

import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtCore import QFile
from ui_mainwindow import Ui_MainWindow

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

if __name__ == "__main__":
    app = QApplication(sys.argv)

    window = MainWindow()
    window.show()

    sys.exit(app.exec())

vs de le charger directement comme ceci: ?

ui_file = QFile("mainwindow.ui")
ui_file.open(QFile.ReadOnly)

loader = QUiLoader()
window = loader.load(ui_file)
window.show()

Je suppose que l'application démarrera plus vite/courir plus vite si converti à l'avance. Est-il autre chose à prendre en considération?

pyqt pyside6 python qt
2021-11-22 11:50:08
1

La meilleure réponse

0

Il y a deux différences principales:

  • en termes de chargement, QUiLoader théoriquement ajoute un peu de surcharge, car il a pour créer l'interface utilisateur à chaque fois, ce qui signifie qu'il doit analyser le fichier XML, créer le nœud de la structure, puis créer l'INTERFACE utilisateur avec l'ensemble de son contenu; l'uic fichier, au lieu de cela, crée directement de l'INTERFACE utilisateur, sauter les deux premières étapes ci-dessus;
  • QUiLoader pouvez seulement créer un nouveau widget basé sur le fichier d'INTERFACE utilisateur, tandis que l'uic méthode permet d'utiliser un déjà existant de la base de widget, et l'enfant, les widgets peuvent être ajoutés;

Ce dernier point est probablement le plus important: l'utilisation de QUiLoader vous ne pouvez pas utiliser directement les sous-classement pour le chargement de l'INTERFACE utilisateur.

Par exemple, si vous créez une fenêtre principale dans Designer, QUiLoader sera de retour une nouvelle QMainWindow. Vous ne pouvez pas (ou, au moins, vous ne devriez pas) faire:

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        ui_file = QFile("mainwindow.ui")
        ui_file.open(QFile.ReadOnly)

        loader = QUiLoader()
        window = loader.load(ui_file, self)

Et vous ne devriez même pas essayer de faire l'objet retourné comme un élément central widget, comme suit:

        self.setCentralWidget(window)

parce que le résultat serait d'avoir un QMainWindow à l'intérieur d' un QMainWindow, qui est découragé et non pris en charge, et peut également créer des problèmes lors de l'utilisation des fonctionnalités standard d'un QMainWindow (en général, les quais et les barres d'outils).

La seule alternative serait de créer une base de forme de widget dans le Concepteur et l'utiliser comme la centrale widget, avec l'inconvénient que les menus, les quais et les barres d'outils doivent être créés par le code.

Pour PySide, la seule possibilité qui permet à plein de sous-classement est d'utiliser le pyside-uic méthode, et ensuite utiliser l'héritage multiple (mais ce n'est pas une obligation, que la composition est une alternative valable de toute façon):

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)

D'autre part, PyQt fournit l' loadUi fonction qui ne fait que setupUi n', depuis le deuxième argument n'est pas le parent du widget, mais le widget lui-même, et le contenu de l'interface utilisateur sera chargé en elle:

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        uic.loadUi("mainwindow.ui", self)

Autant que je sache, PySide ne fournit pas à la même chose encore.

Notez que le chargement de l'interface utilisateur au moment de l'exécution a deux questions, de toute façon, et pour les deux liaisons:

  • il n'y a pas d'avant vérifications, si l'INTERFACE utilisateur de fichier est corrompu ou invalide, ou a pris en charge les fonctionnalités/propriétés dues à l'incompatibilité de version, il ne peut pas charger correctement ou même tomber en panne;
  • lors de l'utilisation d'un IDE, il n'y a pas de complétion de code pour les objets de l'interface utilisateur, car ils ne sont chargés que lors de l'exécution;

Ceux ne sont pas les grandes questions, mais il est important d'en être conscient.

2021-11-22 14:09:05

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................