0

いくつかの最初のページで情報を取得し、この情報を最終ページに要約する QWizard を構築したいと考えています。ユーザーは、情報を失うことなく、最初のページに戻って値を更新できる必要があります。したがって、私は QWizard.IndependentPages オプションを使用しています。これにより、Qt が以前の入力データをクリアする cleanupPage() を実行できなくなります。ただし、問題は、initializePage() もページが最初にアクセスされたときにのみ呼び出されることです。

最終ページの情報を前のページで入力されたもので常に更新できるようにするためのクリーンな方法が見つからないようです。

機能をそのまま説明するために、3 ページの小さなコードを添付しました。2 番目のページに移動し、データを入力してから、3 ページでこのデータを確認します。2 ページに戻ると、前のデータがまだ表示されます (必要に応じて)。1 ページに移動してから 2 ページに移動すると、最初のデータのままです。データが表示されます (必要に応じて)。次に、ページ 2 のデータが変更され、ユーザーがページ 3 に移動すると、古いデータがまだ表示されます。これは、コンストラクターまたは initializePage() 関数が呼び出されておらず、このラベルの更新をトリガーするものが何もないためです。

from os import terminal_size
import sys
import csv
from PyQt5 import QtCore

from PyQt5.QtCore import QDir
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QFrame, QWizard, QWizardPage, QVBoxLayout, QLabel, QFormLayout, QRadioButton, QLineEdit, QComboBox, \
    QGroupBox, QApplication, QCheckBox, QHBoxLayout, QScrollArea, QWidget



wizard_page_index = {
    "IntroPage": 0,
    "EvalPage": 1,
    "RegisterPage": 2
}


TEST = ""

class LicenseWizard(QWizard):
    def __init__(self):
        super().__init__()
        self.setPage(wizard_page_index["IntroPage"], IntroPage())
        self.setPage(wizard_page_index["EvalPage"], EvalPage())
        self.setPage(wizard_page_index["RegisterPage"], RegisterPage())

        self.setStartId(wizard_page_index["IntroPage"])

        self.setWindowTitle("Test Wizard")
        self.setOption(QWizard.IndependentPages)



class IntroPage(QWizardPage):
    def __init__(self):
        super().__init__()

        self.setTitle("Intro Page")

        data_source_layout = QFormLayout() 

        eval_btn = QRadioButton("evaluate")
        self.registerField("evaluate_btn", eval_btn)
        data_source_layout.addWidget(eval_btn)

        register_btn = QRadioButton("register")
        self.registerField("register_btn", register_btn)
        data_source_layout.addWidget(register_btn)

        register_btn.setChecked(True)

        layout = QVBoxLayout()
        layout.addWidget(eval_btn)
        layout.addWidget(register_btn)

        self.setLayout(layout)

    def nextId(self) -> int:
        if self.field("evaluate_btn"):
            return wizard_page_index["EvalPage"]
        else:
            return wizard_page_index["RegisterPage"]
            

class EvalPage(QWizardPage):
    def __init__(self):
        super().__init__()
        self.setTitle("EvalPage")

        layout = QFormLayout()
        model_name = QLineEdit(TEST)
        layout.addRow("Model Name:", model_name)
        self.registerField("model_name*", model_name)

        self.setLayout(layout)

    def nextId(self) -> int:
        return wizard_page_index["RegisterPage"]



class RegisterPage(QWizardPage):
    def __init__(self):
        super().__init__()
        self.setTitle("RegisterPage")
        self.label2 = QLabel()
        self.label2.setFrameStyle(QFrame.Panel)
        self.label2.setText(self.field("model_name"))

        layout = QFormLayout()
        
        layout.addRow("name:", self.label2)

        self.setLayout(layout)

        

    def initializePage(self) -> None:
        self.label2.setText(self.field("model_name"))
        

    def nextId(self) -> int:
    #    self.label2.setText(self.field("model_name"))
        return wizard_page_index["EvalPage"]



if __name__ == "__main__":

    application = QApplication(sys.argv)
    wizard = LicenseWizard()
    wizard.show()
    return_code = application.exec_()

    
    input('Press ENTER to exit')
    sys.exit(return_code)
4

1 に答える 1