Co jest zaletą konwersji pliku interfejsu użytkownika w kod Pythona w porównaniu z jego bezpośredni pobraniem? [duplikat]

0

Pytanie

Czy korzyść w tym, aby:

Przekształcenie go w pythonie pyside6-uic mainwindow.ui > ui_mainwindow.py a potem

import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtCore import QFile
from ui_mainwindow import Ui_MainWindow

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

if __name__ == "__main__":
    app = QApplication(sys.argv)

    window = MainWindow()
    window.show()

    sys.exit(app.exec())

w porównaniu z prostą instalacją, na przykład: ?

ui_file = QFile("mainwindow.ui")
ui_file.open(QFile.ReadOnly)

loader = QUiLoader()
window = loader.load(ui_file)
window.show()

Przypuszczam, że aplikacja uruchomi się szybciej/uruchomi się szybciej, jeśli go zmień. Czy jest jeszcze coś, o czym należy pomyśleć?

pyqt pyside6 python qt
2021-11-22 11:50:08
1

Najlepsza odpowiedź

0

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.

2021-11-22 14:09:05

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................