Existují dva hlavní rozdíly:
- z hlediska zatížení, QUiLoader teoreticky přidá trochu nad hlavou, protože to má stavět ui pokaždé, což znamená, že musí analyzovat XML soubor, vytvořit uzel struktury, a pak vytvořit uživatelské ROZHRANÍ se všemi jeho obsah; uic soubor, místo, přímo vytváří UI, přeskočit první dva kroky výše;
- QUiLoader může pouze vytvořit nový widget, založený na UI soubor, zatímco uic metoda umožňuje použít již existující základnou widgetu, a dítě widgety mohou být přidány k ní;
Druhý bod je asi nejdůležitější: použití QUiLoader nelze přímo použít subclassing pro načtený UI.
Například, pokud jste vytvořit hlavní okno v návrháři, QUiLoader vrátí nový QMainWindow. Nelze (nebo alespoň by neměl) udělat následující:
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 neměli byste ani snažit, aby se vrátil objekt jako centrální widget, stejně jako následující:
self.setCentralWidget(window)
protože výsledek bude mít QMainWindow uvnitř a QMainWindow, který je znechucený a nepodporovaný, a může také způsobit problémy při použití standardní funkce QMainWindow (typicky, doky a panely nástrojů).
Jedinou alternativou by bylo vytvořit základní formě widgetu v Designer a použít jako centrální widget, s nevýhodou, že menu, doky a panely nástrojů musí být vytvořeny kódem.
Pro PySide, jediná možnost, která umožňuje plnou subclassing je používat pyside-uic metoda a pak nakonec použít vícenásobnou dědičnost (ale to není podmínkou, protože složení je vhodnou alternativou tak jako tak):
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
Na druhou stranu, PyQt poskytuje loadUi
funkce, která vlastně dělá to, co setupUi
ano, protože druhý argument není nadřazený widget, ale widget sám o sobě, a obsah ui bude načten do :
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
uic.loadUi("mainwindow.ui", self)
Pokud vím, PySide nenabízí něco podobného.
Všimněte si, že zatížení ui za běhu má dva problémy, a to jak pro vázání:
- neexistuje žádný předchozí zdravý rozum kontrole, je-li UI soubor je poškozený nebo neplatný, nebo má nepodporované funkce/vlastnosti vzhledem k neshoda verzí, to nemusí načíst správně nebo dokonce pád;
- při použití IDE, tam je žádné doplňování kódu pro uživatelské rozhraní, objekty, protože jsou pouze načteny za běhu;
Ty, které nejsou zásadní problémy, ale je důležité být si vědom z nich.