Aká je výhoda premeny ui súbor Python kód vs načítanie priamo? [duplicitné]

0

Otázka

Je tam výhodu:

Konverziou na python pyside6-uic mainwindow.ui > ui_mainwindow.py a potom

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

v. nakladanie to priamo ako tak: ?

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

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

Predpokladám, že aplikácia bude štart rýchlejší/bežať rýchlejšie, ak sa prevedú vopred. Je tam ešte niečo, aby zvážila?

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

Najlepšiu odpoveď

0

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.

2021-11-22 14:09:05

V iných jazykoch

Táto stránka je v iných jazykoch

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