Как правильно инициализировать страницу QWizard?

У меня проблемы с отправкой данных с одной страницы QWizard на другую. Я использую переменную my_nameобъекта QWizard в качестве контейнера. Мой подход: всякий раз, когда я меняю текст QLineEdit на Page1, переменная my_nameизменений моего объекта QWizard. И всякий раз, когда я нажимаю кнопку "Далее" на Page1, Page2 инициализируется с помощью метода QWizard.initializePage(2). Но объект QLabel на Page2 не обновляется на основе my_nameпеременная объекта QWizard. Хотя я инициализировал Page2также. Что не так с моим подходом?

Мой код:

import sys
from PyQt5.QtWidgets import *

class Window(QWizard):
    def __init__(self):
        super(Window, self).__init__()
        self.firstPage = MainPage(parent=self)
        self.my_name = 'Random'
        self.secondPage = Page2(parent=self)

        self.addPage(self.firstPage)
        self.button(QWizard.NextButton).clicked.connect(lambda: self.initializePage(2))
        self.addPage(self.secondPage)

class MainPage(QWizardPage):
    def __init__(self, parent=None):
        self.Parent = parent
        super(MainPage, self).__init__(parent)

        self.setTitle("Plz input your name?")

        self.NameLabel = QLabel("&Name:")
        self.NameLineEdit = QLineEdit()
        self.NameLineEdit.textChanged.connect(self.assign)
        self.NameLabel.setBuddy(self.NameLineEdit)

        layout = QHBoxLayout()
        layout.addWidget(self.NameLabel)
        layout.addWidget(self.NameLineEdit)
        self.setLayout(layout)

    def assign(self):
        self.Parent.my_name = self.NameLineEdit.text()
        print(f'Parent text is: {self.Parent.my_name}')

class Page2(QWizardPage):
    def __init__(self, parent=None):
        super(Page2, self).__init__()
        self.Parent = parent

        vbox = QVBoxLayout()
        label = QLabel()
        label.setText(f'My name is : {self.Parent.my_name}')
        vbox.addWidget(label)

        self.setLayout(vbox)

def main():
    app = QApplication(sys.argv)
    app.setStyle('plastique')

    window = Window()
    window.setWizardStyle(1)
    window.show()
    app.exec_()

if __name__ == "__main__":
    sys.exit(main())

1 ответ

Изменение значения переменной "my_name" не меняет того, что показывает QLabel, поскольку QLabel копирует текст. С другой стороны, не стоит звонить initializePage(2)поскольку это защищенный метод, вызываемый изнутри. Решение состоит в том, чтобы переопределить метод initializePage QWizardPage:

class Page2(QWizardPage):
    def __init__(self, parent=None):
        super(Page2, self).__init__()
        self.Parent = parent

        vbox = QVBoxLayout(self)
        self.label = QLabel()
        self.label.setText(f'My name is : {self.Parent.my_name}')
        vbox.addWidget(self.label)

    def initializePage(self):
        self.label.setText(f'My name is : {self.Parent.my_name}')

Хотя я вижу, что вы изобретаете велосипед, так как эта характеристика, регистрирующая поля, уже есть:

class Window(QWizard):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.firstPage = MainPage()
        self.secondPage = Page2()

        self.addPage(self.firstPage)
        self.addPage(self.secondPage)


class MainPage(QWizardPage):
    def __init__(self, parent=None):
        super(MainPage, self).__init__(parent)

        self.setTitle("Plz input your name?")

        self.NameLabel = QLabel("&Name:")
        self.NameLineEdit = QLineEdit()
        self.NameLabel.setBuddy(self.NameLineEdit)

        layout = QHBoxLayout(self)
        layout.addWidget(self.NameLabel)
        layout.addWidget(self.NameLineEdit)

        self.registerField("my_name", self.NameLineEdit)


class Page2(QWizardPage):
    def __init__(self, parent=None):
        super(Page2, self).__init__(parent)

        vbox = QVBoxLayout(self)
        self.label = QLabel()
        vbox.addWidget(self.label)

    def initializePage(self):
        self.label.setText(f'My name is : {self.field("my_name")}')
        super(Page2, self).initializePage()
Другие вопросы по тегам