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.