Qual è il vantaggio di convertire un file di interfaccia utente di codice Python vs carico diretto? [duplica]

0

Domanda

C'è un vantaggio:

La conversione a python pyside6-uic mainwindow.ui > ui_mainwindow.py e poi

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 carico diretto in questo modo: ?

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

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

Suppongo che l'app di avvio più veloce/più veloce se convertito in anticipo. C'è qualcos'altro da considerare?

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

Migliore risposta

0

Ci sono due differenze principali:

  • in termini di capacità di carico, QUiLoader teoricamente aggiunge un po ' di costi, in quanto ha per costruire l'interfaccia utente ogni volta, il che significa che si deve analizzare il file XML, creare il nodo della struttura, e quindi creare l'interfaccia utente con tutti i suoi contenuti; l'uic file, invece, crea direttamente l'interfaccia utente, saltando i primi due passaggi di cui sopra;
  • QUiLoader può solo creare un nuovo widget basato su file di interfaccia utente, mentre l'uic metodo permette di utilizzare un già esistente base del widget, e il bambino widget possono essere aggiunti ad esso;

Quest'ultimo punto è probabilmente il più importante: l'uso di QUiLoader non è possibile utilizzare direttamente la creazione di sottoclassi per il caricamento dell'interfaccia utente.

Per esempio, se si crea una finestra principale nella Progettazione, QUiLoader restituirà un nuovo QMainWindow. Non è possibile (o, almeno, non si dovrebbe) fare il seguente:

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 si dovrebbe anche cercare di rendere l'oggetto restituito come centrale di widget, come il seguente:

        self.setCentralWidget(window)

perché il risultato sarebbe quello di avere un QMainWindow all'interno di un QMainWindow, che è scoraggiato e non supportato, e potrebbe anche creare dei problemi quando si utilizza la funzionalità standard di un QMainWindow (in genere, delle banchine e delle barre degli strumenti).

L'unica alternativa sarebbe quella di creare un modulo di base widget nella Progettazione e lo uso come centrale widget, con lo svantaggio che i menu, le banchine e le barre degli strumenti devono essere creati dal codice.

Per PySide, l'unica possibilità che consente la creazione di sottoclassi è quello di utilizzare il pyside-uic metodo e poi eventualmente utilizzare l'ereditarietà multipla (ma non è un obbligo, come composizione è una valida alternativa comunque):

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

D'altra parte, fornisce le PyQt loadUi funzione che effettivamente quello setupUi fa, poiché il secondo argomento non è il widget genitore, ma il widget stesso, e il contenuto di interfaccia utente verrà caricato in esso:

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

Per quanto ne so, PySide non fornisce qualcosa di simile di sicurezza.

Nota che il caricamento dell'interfaccia utente in fase di runtime ha due problemi in ogni caso, e per entrambe le associazioni:

  • non c'è prima la sanità mentale di controllo, se la UI file è danneggiato o non valido, o ha caratteristiche non supportate/proprietà a causa di incompatibilità di versione, potrebbe non caricare correttamente o addirittura crash;
  • quando si utilizza un IDE, non c'è il completamento del codice per gli oggetti dell'interfaccia utente, dal momento che sono solo caricato in fase di esecuzione;

Quelli non sono questioni importanti, ma è importante essere consapevoli di loro comunque.

2021-11-22 14:09:05

In altre lingue

Questa pagina è in altre lingue

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