Qual é a vantagem de converter um arquivo da interface do usuário para Python vs código de carregá-lo diretamente? [duplicado]

0

Pergunta

Está aí uma vantagem para:

A conversão para o python pyside6-uic mainwindow.ui > ui_mainwindow.py e, em seguida,

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. carregá-lo diretamente, como por exemplo: ?

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

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

Eu suponho que o aplicativo irá iniciar mais rápido/correr mais rápido se convertido de antemão. Há algo mais a considerar?

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

Melhor resposta

0

Existem duas diferenças principais:

  • em termos de carregamento, QUiLoader, teoricamente, adiciona um pouco de peso, porque ele tem para construir a interface de usuário toda vez que, o que significa que ele tem para analisar o arquivo XML, crie a estrutura de nós e, em seguida, criar a INTERFACE do usuário com todos os seus conteúdos; o uic do arquivo, em vez disso, cria diretamente a INTERFACE do usuário, pular os dois primeiros passos acima;
  • QUiLoader só pode criar um novo widget com base no arquivo da INTERFACE do usuário, enquanto o uic método permite o uso de um já existente da base de dados de widget, e a criança widgets podem ser adicionados a ele;

O último ponto é provavelmente o mais importante: o uso QUiLoader você não pode usar diretamente subclassificação para o carregado de INTERFACE do usuário.

Por exemplo, se você criar uma janela principal do Designer, QUiLoader irá retornar um novo QMainWindow. Você não pode (ou, pelo menos, você não deve) fazer o seguinte:

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)

E você não deve tentar fazer com que o objeto retornado como central widget, como o seguinte:

        self.setCentralWidget(window)

porque o resultado seria ter um QMainWindow dentro de um QMainWindow, que está desanimado e sem suporte, e também pode criar problemas quando usando os recursos padrão de um QMainWindow (normalmente, docas e barras de ferramentas).

A única alternativa seria criar um formulário básico widget no Designer e use-o como central widget, com a desvantagem que os menus, docas e barras de ferramentas têm de ser criados por código.

Para PySide, a única possibilidade que permite uma subclassificação é usar o pyside-uic método e, em seguida, eventualmente, utilizar a herança múltipla (mas isso não é uma exigência, como a composição é uma alternativa válida de qualquer maneira):

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

Por outro lado, PyQt oferece a loadUi função que realmente faz o que setupUi não, desde que o segundo argumento não é o pai widget, mas o widget de si, e o conteúdo da interface de usuário será carregado para ele:

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

Até onde eu sei, PySide não fornece qualquer coisa semelhante ainda.

Observe que o carregamento da interface do usuário em tempo de execução tem dois problemas, de qualquer forma, e para as duas ligações:

  • não há antes de verificações de sanidade, se a INTERFACE do usuário arquivo está corrompido ou inválido, ou que tenha suportado características/propriedades, devido à incompatibilidade de versão, ele pode não carregar corretamente ou até mesmo falhar;
  • quando usar uma IDE, não há conclusão de código para objetos de interface do usuário, uma vez que eles só são carregados em tempo de execução;

Essas não são questões importantes, mas é importante estar atento a eles de qualquer maneira.

2021-11-22 14:09:05

Em outros idiomas

Esta página está em outros idiomas

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