いくつかの最初のページで情報を取得し、この情報を最終ページに要約する 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)