Как загрузить файл Qt Designer (.ui) в QWizardPage, используя PySide2
Я хочу спроектировать свои QWizardPages в Qt Designer, и я хочу загрузить их в свою программу Python с PySide2. Ранее я использовал PyQt5 без проблем, но переход на PySide2 кажется более сложным, чем ожидалось. Проблема, с которой я сталкиваюсь, заключается в том, что когда я добавляю QWizardPage в свой QWizard, страница действительно добавляется в мастер, но также добавляется и другая (пустая) страница. Я не могу понять, что я делаю неправильно, поэтому мне было интересно, может ли кто-то посмотреть.
Я пытался добавить страницы с функциями addPage() и setPage(), но они дают одинаковые результаты. Я также заметил, что когда я явно устанавливаю заголовок страницы с помощью setTitle(), пустая (нежелательная) страница получает этот заголовок, но не страницу, которую я разработал в Qt Designer.
import os
import sys
from PySide2.QtWidgets import QWizard, QWizardPage, QApplication
from PySide2.QtCore import QFile
from PySide2.QtUiTools import QUiLoader
from enum import Enum
class MyWizard(QWizard):
def __init__(self):
super().__init__()
self.setPage(PageNumbers.page_one.value, PageOne(self))
class PageOne(QWizardPage):
def __init__(self, parent):
super().__init__(parent)
ui_file = os.path.join(__file__, '..', 'pageOne.ui')
file = QFile(ui_file)
file.open(QFile.ReadOnly)
loader = QUiLoader()
loader.load(file, parent)
file.close()
self.setTitle("This is another test Title")
class PageNumbers(Enum):
page_one = 1
if __name__ == '__main__':
app = QApplication(sys.argv)
wizard = MyWizard()
wizard.show()
app.exec_()
То, что я ожидал бы, это иметь только одну QWizardPage, показывающую непосредственно с кнопкой Готово. Вместо этого я получаю две QWizardPages, как показано на этом рисунке:
Может кто-нибудь сказать мне, что происходит?
(Я получаю ожидаемый результат, используя PyQt5 со следующим кодом: https://pastebin.com/6W2sx9M1)
1 ответ
Разработчики PyQt
реализовать функции, чтобы иметь возможность создавать классы на основе.ui, который не реализован в Qt по умолчанию (Qt/C++ использует MOC
сделать эту работу), но в случае PySide2-Qt for python
он не реализует его, имеет только QUiLoader
класс, который позволяет создавать виджет на основе.ui в отличие от PyQt
это позволяет заполнить класс.
В заключение, в PySide2 нет эквивалента функции loadUi, поэтому вы не можете реализовать ту же логику. PySide2 не является PyQt5, есть собственные эквиваленты, поскольку они используют одну и ту же базу, но имеют реализации, ограничения и преимущества.
Переходя к практической проблеме, учитывая, что.ui находится рядом с.py, решение состоит в следующем:
import os
import sys
from PySide2 import QtCore, QtWidgets, QtUiTools
from enum import Enum
class PageNumbers(Enum):
page_one = 0
class MyWizard(QtWidgets.QWizard):
def __init__(self):
super().__init__()
ui_file = os.path.join(os.path.dirname(os.path.abspath(__file__)) ,'PageOne.ui')
page_one = create_widget(ui_file, self)
self.setPage(PageNumbers.page_one.value, page_one)
def create_widget(filename, parent=None):
file = QtCore.QFile(filename)
if not file.open(QtCore.QFile.ReadOnly):
return
loader = QtUiTools.QUiLoader()
widget = loader.load(file, parent)
return widget
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
wizard = MyWizard()
wizard.show()
sys.exit(app.exec_())