Existujú dva hlavné rozdiely:
- z hľadiska zaťaženia, QUiLoader teoreticky pridá trochu réžiu, pretože to má stavať ui všetko, čo znamená, že to má na analýzu XML súboru, vytvorenie uzla štruktúry, a potom vytvoriť UI so všetkými jeho obsah; uic súbor, namiesto toho, priamo vytvára UI, skákanie prvé dva kroky uvedené vyššie;
- QUiLoader môže iba vytvoriť nový widget na základe UI súbor, zatiaľ čo uic metóda umožňuje použiť už existujúcej základne widget, a dieťa widgety môžu byť pridané na to;
Druhý bod je asi najdôležitejšie: pomocou QUiLoader nie je možné priamo použiť štruktúry tried pre naložené UI.
Napríklad, ak vytvoríte v hlavnom okne Návrhára, QUiLoader vrátiť nové QMainWindow. Nemôžete (alebo aspoň by ste mali nie), postupujte takto:
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)
A nemali by ste dokonca sa snažia, aby sa vrátil objekt ako centrálne widget, rovnako ako nasledujúce:
self.setCentralWidget(window)
pretože výsledok by sa mal mať QMainWindow vnútri a QMainWindow, ktorý je neistý a podporované, a môže tiež spôsobiť problémy, ak používate štandardné funkcie QMainWindow (zvyčajne, doky a panely s nástrojmi).
Jedinou alternatívou by mohlo byť vytvorenie základnej podobe widgetu v Návrhár a použiť ako centrálny widget, s nevýhodou, že ponuky, doky a panely s nástrojmi musia byť vytvorené kód.
Pre PySide, iba možnosť, ktorá umožňuje plný štruktúry tried je použitie pyside-uic metódy a nakoniec použiť viacero dedičstva (ale to nie je podmienkou, ako zloženie je platný alternatívne rovnako):
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
Na druhej strane, PyQt poskytuje loadUi
funkcia, ktorá vlastne robí to, čo setupUi
áno, pretože druhý argument nie je rodič widget, ale widget sám, a obsah ui bude vložený do nej:
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
uic.loadUi("mainwindow.ui", self)
Pokiaľ viem, PySide neposkytuje nič podobné ešte.
Upozorňujeme, že nakladanie ui v režime runtime má dve otázky, rovnako, a pre obe väzby:
- nie je pred rozum kontrolu, ak UI súbor je poškodený alebo neplatné, alebo má nepodporované funkcie/vlastnosti v dôsledku verzia nesúlad, nemusí nahrať správne, alebo dokonca zlyhať;
- pri použití IDE, nie je dokončovanie kódu pre ui objekty, pretože sú len naložené v behu;
Nie sú to veľké problémy, ale je dôležité uvedomiť si z nich rovnako.