Как загрузить файл 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_())
Другие вопросы по тегам