Bir uı dosyasını doğrudan yüklemeye karşı Python koduna dönüştürmenin avantajı nedir? [çoğaltmak]

0

Soru

Bunun bir avantajı var mı:

Python'a dönüştürme pyside6-uıc ana penceresi.kullanıcı arayüzü > ui_mainwindow.py ve sonra

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 doğrudan böyle yükleniyor:?

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

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

Önceden dönüştürülürse uygulamanın daha hızlı başlayacağını/daha hızlı çalışacağını varsayıyorum. Düşünecek başka bir şey var mı?

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

En iyi cevabı

0

İki ana fark vardır:

  • yükleme açısından, QUiLoader teorik olarak biraz ek yük ekler, çünkü her seferinde kullanıcı arayüzünü oluşturması gerekir, yani XML dosyasını ayrıştırması, düğüm yapısını oluşturması ve ardından kullanıcı arayüzünü tüm içeriğiyle oluşturması gerekir; bunun yerine uıc dosyası, yukarıdaki ilk iki adımı atlayarak doğrudan kullanıcı arayüzünü oluşturur;
  • QUiLoader yalnızca UI dosyasına dayalı yeni bir widget oluşturabilirken, uıc yöntemi zaten var olan bir temel widget'ı kullanmanıza izin verir ve alt widget'lar buna eklenebilir;

İkinci nokta muhtemelen en önemlisidir: Quiloader'ı kullanarak, yüklenen UI için doğrudan alt sınıflamayı kullanamazsınız.

Örneğin, Designer'da bir ana pencere oluşturursanız, QUiLoader yeni bir QMainWindow döndürür. Aşağıdakileri yapamazsınız (veya en azından yapmamalısınız):

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)

Ve döndürülen nesneyi aşağıdaki gibi merkezi bir widget olarak yapmaya bile çalışmamalısınız:

        self.setCentralWidget(window)

çünkü sonuç, bir Qmainwindow'un içinde, önerilmeyen ve desteklenmeyen bir Qmainwindow'a sahip olmak olacaktır ve ayrıca bir Qmainwindow'un standart özelliklerini (genellikle rıhtımlar ve araç çubukları) kullanırken sorun yaratabilir.

Tek alternatif, Tasarımcıda temel bir form widget'ı oluşturmak ve bunu merkezi widget olarak kullanmak, menülerin, rıhtımların ve araç çubuklarının kod tarafından oluşturulması gerektiğidir.

PySide için, tam alt sınıflamaya izin veren tek olasılık, pyside-uıc yöntemini kullanmak ve sonunda çoklu devralmayı kullanmaktır (ancak kompozisyon yine de geçerli bir alternatif olduğu için bu bir gereklilik değildir):

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

Öte yandan, PyQt şunları sağlar: loadUi aslında ne yapan işlev setupUi ikinci argüman ana widget değil, widget'ın kendisi olduğundan ve kullanıcı arayüzünün içeriği buna yükleneceğinden:

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

Bildiğim kadarıyla, PySide henüz benzer bir şey sunmuyor.

Zamanında uı yükleme zaten iki konu var, unutmayın ve her iki bağlamaları için :

  • UI dosyası bozuk veya geçersizse veya sürüm uyuşmazlığı nedeniyle desteklenmeyen özelliklere/özelliklere sahipse, düzgün yüklenmeyebilir veya hatta çökebilir, önceden akıl sağlığı denetimi yoktur;
  • bir IDE kullanırken, yalnızca çalışma zamanında yüklendiklerinden uı nesneleri için kod tamamlama yoktur;

Bunlar önemli konular değil, ama yine de onların farkında olmak önemlidir.

2021-11-22 14:09:05

Diğer dillerde

Bu sayfa diğer dillerde

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