Jaká je výhoda převod ui soubor Python kód vs vložením přímo? [duplicitní]

0

Otázka

Je tam výhoda:

Převod do pythonu pyside6-uic mainwindow.ui > ui_mainwindow.py a pak

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())

vs. zatížení je přímo jako tak: ?

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

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

Předpokládám, že aplikace se spustí rychleji/rychlejší, pokud převede předem. Je tam něco jiného, aby zvážila?

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

Nejlepší odpověď

0

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.

2021-11-22 14:09:05

V jiných jazycích

Tato stránka je v jiných jazycích

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