Как загрузить файл Qt Designer (.ui) в QWizardPage, используя PySide2 - PullRequest
0 голосов
/ 18 января 2019

Я хочу спроектировать свои 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, как показано на этом рисунке:

enter image description here

Может кто-нибудь сказать мне, что происходит?

(я получаю ожидаемый результат, используя PyQt5 со следующим кодом: https://pastebin.com/6W2sx9M1)

1 Ответ

0 голосов
/ 18 января 2019

Разработчики 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_())
...