Care este avantajul de a converti un fișier ui să-cod Python vs încărcare direct? [duplicat]

0

Problema

Există un avantaj:

Conversia la python pyside6-uic mainwindow.ui > ui_mainwindow.py și apoi

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 încărcare direct astfel: ?

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

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

Presupun că aplicația va porni mai repede/rula mai repede dacă convertite în prealabil. Este ceva să ia în considerare?

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

Cel mai bun răspuns

0

Există două diferențe principale:

  • în termeni de încărcare, QUiLoader teoretic adaugă un pic de regie, deoarece are pentru a construi ui de fiecare dată, în sensul că ea are pentru a analiza fișier XML, crea nodul structurii, și apoi a crea UI cu tot conținutul său; fișa uic fișier, în schimb, creează în mod direct UI, sărind peste primele două etape de mai sus;
  • QUiLoader poate crea doar un nou widget bazat pe UI fișier, în timp ce uic metodă vă permite să utilizați o deja existente widget de bază, iar copilul widget-uri pot fi adăugate la acesta;

Acest ultim punct este probabil cel mai important: folosind QUiLoader nu puteți folosi direct subclasarea pentru încărcate UI.

De exemplu, dacă veți crea o fereastră principală în Designer, QUiLoader va reveni cu un nou QMainWindow. Nu se poate (sau, cel puțin, ar trebui să nu) face următoarele:

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 nici nu ar trebui să încerce să facă obiectul returnat central widget, cum ar fi următoarele:

        self.setCentralWidget(window)

pentru că rezultatul ar fi să avem un QMainWindow în interiorul o QMainWindow, care este descurajat și de neacceptat, și s-ar putea crea, de asemenea, probleme atunci când se utilizează caracteristicile standard ale unui QMainWindow (de obicei, docuri și bare de instrumente).

Singura alternativa ar fi de a crea o formă de bază de widget-uri de Designer și de a folosi ca central widget, cu dezavantajul că, meniuri, docuri și bare de instrumente trebuie să fie create de cod.

Pentru PySide, singura posibilitate care permite subclasarea este de a utiliza pyside-uic metodă și apoi în cele din urmă de a folosi moștenirea multiplă (dar asta nu e o cerință, deoarece compoziția este o alternativă valabilă, oricum):

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

Pe de altă parte, PyQt oferă loadUi funcția care face de fapt ceea ce setupUi nu, deoarece cel de-al doilea argument nu este părintele widget, dar widget-ul în sine, și conținutul ui va fi încărcat în ea:

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        uic.loadUi("mainwindow.ui", self)

În măsura în care știu, PySide nu oferă nimic asemănător încă.

Rețineți că încărcarea ui la runtime a două probleme oricum, și pentru ambele legaturi:

  • nu există nici o prealabilă verificare bun-simț, dacă fișierul UI este corupt sau invalid, sau a neacceptat caracteristici/proprietăți din cauza de nepotrivire de versiune, este posibil să nu se încarcă în mod corespunzător sau chiar accident;
  • atunci când se utilizează un IDE, nu e nici un cod pentru finalizarea ui obiecte, deoarece acestea sunt încărcate doar la runtime;

Astea nu sunt probleme majore, dar este important să fie conștienți de ele oricum.

2021-11-22 14:09:05

În alte limbi

Această pagină este în alte limbi

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