【问题标题】:How to properly initialize a QWizard page?如何正确初始化 QWizard 页面?
【发布时间】:2021-02-25 06:27:13
【问题描述】:

我在将数据从一个 QWizard 页面发送到下一个页面时遇到问题。我使用 QWizard 对象的变量my_name 作为容器。 我的方法是:每当我在Page1 上更改QLineEdit 的文本时,我的QWizard 对象的变量my_name 就会发生变化。每当我单击Page1 上的下一步按钮时,Page2 都会使用QWizard.initializePage(2) 方法进行初始化。但是Page2 上的 QLabel 对象不会基于 QWizard 对象的my_name 变量进行更新。即使我也初始化了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())

【问题讨论】:

    标签: python pyqt5 qwizard qwizardpage


    【解决方案1】:

    更改变量“my_name”的值不会更改 QLabel 显示的内容,因为 QLabel 会复制文本。另一方面,您不应该调用initializePage(2),因为它是在内部调用的受保护方法。解决方法是重写QWizardPage的initializePage方法:

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 2010-11-11
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多