Istnieją dwie podstawowe różnice:
- z punktu widzenia pobierania, QUiLoader teoretycznie dodaje trochę koszty, ponieważ musi on za każdym razem tworzyć interfejs użytkownika, co oznacza, że musi analizować plik XML, tworzenie struktury witryny, a następnie tworzyć interfejs użytkownika z całą jego zawartością; zamiast tego plik uic bezpośrednio tworzy interfejs użytkownika, pomijając pierwsze dwa kroki powyżej;
- Ładowarka może utworzyć tylko nowy widget na podstawie pliku interfejsu użytkownika, podczas gdy metoda uic pozwala wykorzystać już istniejący podstawowy widżet, a potomne wzory mogą być dodawane do niego;
Ostatniej chwili, prawdopodobnie jest najważniejsze: za pomocą QUiLoader, nie można bezpośrednio korzystać z podklasy dla załadowanego interfejsu użytkownika.
Na przykład, jeśli tworzysz okno główne w konstruktorze, QUiLoader zwróci nowe QMainWindow. Nie możesz (lub przynajmniej nie powinny) w następujący sposób:
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 nawet nie trzeba próbować zrobić zwrócony obiekt centralnym widget, jak pokazano poniżej:
self.setCentralWidget(window)
ponieważ wynikiem byłoby obecność QMainWindow wewnątrz QMainWindow, że nie jest zalecane i nie jest obsługiwany, a także może stworzyć problemy przy użyciu standardowych funkcji QMainWindow (zazwyczaj doków i paski narzędzi).
Jedyną alternatywą byłoby utworzyć widget bazowej w konstruktorze formy i używać go jako głównego widget, z wadą, że menu, doki i pasek narzędzi, należy tworzyć za pomocą kodu.
Dla PySide jedyna możliwość, która pozwala stworzyć pełny podklasy, to użyć metody pyside-uic, a następnie w końcu użyć wielokrotne dziedziczenie (ale nie jest to wymagane, tak jak kompozycja w każdym przypadku jest dopuszczalną alternatywą).:
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
Z drugiej strony, PyQt zapewnia loadUi
funkcja, która w rzeczywistości robi to, co setupUi
sprawia, że, tak jak drugi argument nie jest nadrzędny widget, a sam widget, i zawartość interfejsu użytkownika zostanie pobrana w nim:
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
uic.loadUi("mainwindow.ui", self)
O ile wiem, PySide dopóki nie oferuje czegoś takiego.
Należy pamiętać, że ładowanie interfejsu użytkownika w czasie wykonywania w każdym razie ma dwa problemy, i dla obu skrótów:
- brak uprzedniego sprawdzenia sanity, jeśli plik interfejsu użytkownika jest uszkodzony lub nieprawidłowy, lub ma nieobsługiwane funkcje/właściwości z powodu niezgodności wersji, może być ładowany prawidłowo lub nawet ulec się;
- podczas korzystania z IDE dla obiektów interfejsu użytkownika nie nastąpi wyłączenie kodu, ponieważ są one ładowane tylko w czasie wykonywania;
Nie jest to podstawowe problemy, ale w każdym przypadku ważne jest, aby wiedzieć o nich.