Există două diferențe principale:
- în termeni de încărcare, QUiLoader teoretic adaugă un pic de regie, deoarece are pentru a construi ui de fiecare dată, în sensul că ea are pentru a analiza fișier XML, crea nodul structurii, și apoi a crea UI cu tot conținutul său; fișa uic fișier, în schimb, creează în mod direct UI, sărind peste primele două etape de mai sus;
- QUiLoader poate crea doar un nou widget bazat pe UI fișier, în timp ce uic metodă vă permite să utilizați o deja existente widget de bază, iar copilul widget-uri pot fi adăugate la acesta;
Acest ultim punct este probabil cel mai important: folosind QUiLoader nu puteți folosi direct subclasarea pentru încărcate UI.
De exemplu, dacă veți crea o fereastră principală în Designer, QUiLoader va reveni cu un nou QMainWindow. Nu se poate (sau, cel puțin, ar trebui să nu) face următoarele:
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)
Și nici nu ar trebui să încerce să facă obiectul returnat central widget, cum ar fi următoarele:
self.setCentralWidget(window)
pentru că rezultatul ar fi să avem un QMainWindow în interiorul o QMainWindow, care este descurajat și de neacceptat, și s-ar putea crea, de asemenea, probleme atunci când se utilizează caracteristicile standard ale unui QMainWindow (de obicei, docuri și bare de instrumente).
Singura alternativa ar fi de a crea o formă de bază de widget-uri de Designer și de a folosi ca central widget, cu dezavantajul că, meniuri, docuri și bare de instrumente trebuie să fie create de cod.
Pentru PySide, singura posibilitate care permite subclasarea este de a utiliza pyside-uic metodă și apoi în cele din urmă de a folosi moștenirea multiplă (dar asta nu e o cerință, deoarece compoziția este o alternativă valabilă, oricum):
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
Pe de altă parte, PyQt oferă loadUi
funcția care face de fapt ceea ce setupUi
nu, deoarece cel de-al doilea argument nu este părintele widget, dar widget-ul în sine, și conținutul ui va fi încărcat în ea:
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
uic.loadUi("mainwindow.ui", self)
În măsura în care știu, PySide nu oferă nimic asemănător încă.
Rețineți că încărcarea ui la runtime a două probleme oricum, și pentru ambele legaturi:
- nu există nici o prealabilă verificare bun-simț, dacă fișierul UI este corupt sau invalid, sau a neacceptat caracteristici/proprietăți din cauza de nepotrivire de versiune, este posibil să nu se încarcă în mod corespunzător sau chiar accident;
- atunci când se utilizează un IDE, nu e nici un cod pentru finalizarea ui obiecte, deoarece acestea sunt încărcate doar la runtime;
Astea nu sunt probleme majore, dar este important să fie conștienți de ele oricum.