¿Cuál es la ventaja de la conversión de un archivo de interfaz de usuario para el código de Python vs carga directamente? [duplicar]

0

Pregunta

Hay una ventaja para:

La conversión de python pyside6-uic mainwindow.interfaz de usuario > ui_mainwindow.py y, a continuación,

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 carga directamente así: ?

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

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

Supongo que la aplicación se inicie más rápido/correr más rápido si se convierte de antemano. ¿Hay algo más a tener en cuenta?

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

Mejor respuesta

0

Hay dos diferencias principales:

  • en términos de carga, QUiLoader teóricamente añade un poco de carga de trabajo porque se tiene que crear la interfaz de usuario cada vez, lo que significa que se tiene que analizar el archivo XML, crear la estructura de nodos y, a continuación, crear la interfaz de usuario con todos sus contenidos; la uic archivo, en lugar de eso, crea directamente la interfaz de usuario, omitiendo la primera de dos pasos anteriores;
  • QUiLoader sólo puede crear un nuevo widget basado en la interfaz de usuario del archivo, mientras que la uic método permite utilizar una ya existente de la base de widget, y el niño los widgets se pueden añadir a la misma;

El último punto es probablemente el más importante: la utilización de QUiLoader usted no puede utilizar directamente la creación de subclases para la carga de interfaz de usuario.

Por ejemplo, si crea una ventana principal en el Diseñador, QUiLoader devolverá un nuevo QMainWindow. Usted no puede (o, al menos, no debe) hacer lo siguiente:

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)

Y usted no debería tratar de hacer que el objeto devuelto como central widget, como el siguiente:

        self.setCentralWidget(window)

porque el resultado sería tener un QMainWindow dentro de un QMainWindow, que se desanime y no admitidos, y que podría crear problemas al utilizar las funciones estándar de un QMainWindow (normalmente, muelles y barras de herramientas).

La única alternativa sería crear un formulario básico widget en el Diseñador y el uso que como central widget, con la desventaja de que los menús, muelles y barras de herramientas tienen que ser creados por el código.

Para PySide, la única posibilidad que permite la plena creación de subclases es el uso de la pyside-uic método y, a continuación, utilizar la herencia múltiple (pero eso no es un requisito, ya que la composición es una alternativa válida, de todos modos):

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

Por otro lado, PyQt proporciona la loadUi la función que en realidad no lo setupUi hace, ya que el segundo argumento no es el widget padre, pero el propio widget, y el contenido de la interfaz de usuario será cargado en ella:

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

Hasta donde yo sé, PySide no ofrece nada parecido aún.

Tenga en cuenta que la carga de la interfaz de usuario en tiempo de ejecución tiene dos problemas, de todos modos, y para ambos enlaces:

  • no existe antes de la cordura, la comprobación de si la interfaz de usuario archivo está dañado o no válido, o no admitida características/propiedades debido a las versiones no coinciden, es posible que no se carga correctamente o incluso accidente;
  • cuando el uso de un IDE, no hay código de terminación para los objetos de interfaz de usuario, ya que sólo se cargan en tiempo de ejecución;

Esos no son temas importantes, pero es importante ser consciente de ellos de todos modos.

2021-11-22 14:09:05

En otros idiomas

Esta página está en otros idiomas

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