В PyQt есть класс QWizard для создания многостраничного мастера
В дочернем (QWizard) классе QWizardPage есть метод registerField(<Свойство>, [, property=None][,changedSignal=0]) который, как указано в документации "регистрирует свойство, с помощью которого можно получить доступ к значению компонента с любой страницы мастера"
но у никак не получается получить доступ к значению page2_number_of_factors на 3ей странице визарда
строки
print('print from page 3 - page2_number_of_factors = ', self.field('page2_number_of_factors'))
self.print_parameter_from_page2()
def print_parameter_from_page2(self):
path = self.field("page2_number_of_factors")
print("page2_number_of_factors = ", path)
выводят None
а мне нужен доступ к значениям
а вот в методе on_click() строка
print(wizard.field('page2_number_of_factors'))
прекрасно работает
Если абстрагироваться от конкретного случая, то вопрос можно сформулировать так:
есть файл
в нем 4 класса и функция инициализации мастера не принадлежащий ни одному классу
в функции есть доступ к нужным методам
3 класса имеют общего родителя QWizardPage
в функции создается объект wizard = Wizard(window)
потом с его помощью получаются данные сохраненные из 3х класов print(wizard.field('page2_number_of_factors'))
как получить доступ к этим методам изнутри других классов?
сейчас 3я страница визарда просто заглушка, мне ее нужно динамически сформировать в зависимости от значения page2_number_of_factors
import configparser
from configparser import ConfigParser
from PyQt5 import QtCore
from PyQt5 import QtWidgets
class Page1(QtWidgets.QWizardPage):
def __init__(self, parent=None):
QtWidgets.QWizardPage.__init__(self, parent)
self.setTitle("Select project name")
self.label_page1 = QtWidgets.QLabel("Select folder, project file name")
self.button_page1 = QtWidgets.QPushButton("Browse")
self.line_edit_page1 = QtWidgets.QLineEdit()
self.box = QtWidgets.QVBoxLayout()
self.box.addWidget(self.label_page1)
self.box.addWidget(self.line_edit_page1)
self.box.addWidget(self.button_page1)
self.setLayout(self.box)
self.registerField("page1data*", self.line_edit_page1)
self.button_page1.clicked.connect(self.save_file_project)
# Open dialog 'Save Project file'
def save_file_project(self):
# global PROJECT_FILE_NAME
f, l = QtWidgets.QFileDialog.getSaveFileName(parent=None,
caption='Save file Project',
directory=QtCore.QDir.currentPath(),
filter="All (*);;Projects (*.pydoe)",
initialFilter="Projects (*.pydoe)")
print('File Name:', f)
file = open(f, 'w')
print('File', ' ', file, ' ', 'opened')
self.line_edit_page1.setText(f)
config = configparser.RawConfigParser()
print('ConfigParser.RawConfigParser()')
config.add_section('DOE_parameters')
config.set('DOE_parameters', 'PROJECT_FILE_NAME', f)
# with open(f, 'wb') as configfile:
config.write(file)
print('on_clicked.config.write')
file.close()
class Page2(QtWidgets.QWizardPage):
def __init__(self, parent=None):
QtWidgets.QWizardPage.__init__(self, parent)
self.setTitle("Select parameters of experiment")
self.type_of_experiments = QtWidgets.QComboBox()
self.number_of_factors = QtWidgets.QComboBox()
self.box_page2 = QtWidgets.QVBoxLayout()
# Create list 'type of experiments'
self.box_page2.addWidget(self.type_of_experiments)
self.type_of_experiments.addItems(["Select type of experiment",
"Full factorial experiment",
"Rotatable plan (second order)"])
print('block 2 pass')
# Create list 'number of factors'
self.box_page2.addWidget(self.number_of_factors)
self.number_of_factors.addItems(["Select number of factors",
"2",
"3",
"4",
"5",
"6",
"7"])
self.setLayout(self.box_page2)
self.registerField('page2_type_experiment', self.type_of_experiments)
self.registerField('page2_number_of_factors', self.number_of_factors)
print('page2_number_of_factors', self.field('page2_number_of_factors'))
class Page3(QtWidgets.QWizardPage):
def __init__(self, parent=None):
QtWidgets.QWizardPage.__init__(self, parent)
self.setTitle("Название страницы 3")
self.setSubTitle("Текст подзаголовка")
self.label3 = QtWidgets.QLabel("Содержимое страницы 3")
self.line3 = QtWidgets.QLineEdit()
self.box3 = QtWidgets.QVBoxLayout()
self.box3.addWidget(self.label3)
self.box3.addWidget(self.line3)
self.setLayout(self.box3)
self.registerField("page3data*", self.line3)
print('print from page 3 - page2_number_of_factors = ', self.field('page2_number_of_factors'))
self.print_parameter_from_page2()
def print_parameter_from_page2(self):
path = self.field("page2_number_of_factors")
print("page2_number_of_factors = ", path)
class Wizard(QtWidgets.QWizard):
def __init__(self, parent=None):
QtWidgets.QWizard.__init__(self, parent)
self.setWindowTitle("Create New Project")
self.setWizardStyle(QtWidgets.QWizard.ClassicStyle)
self.page1 = Page1()
self.page2 = Page2()
self.page3 = Page3()
self.idPage1 = self.addPage(self.page1)
self.idPage2 = self.addPage(self.page2)
self.idPage3 = self.addPage(self.page3)
def on_clicked(self):
print('start onclick')
# app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
print('window = QtWidgets.QWidget()')
window.setWindowTitle("New Project QWizard")
window.resize(300, 70)
window.show()
wizard = Wizard(window)
result = wizard.exec()
if result == QtWidgets.QDialog.Accepted:
print("Нажата кнопка Finish")
print(wizard.field("page1data"))
print(wizard.field('page2_type_experiment'))
print(wizard.field('page2_number_of_factors'))
print(wizard.field("page3data"))
else:
print("Нажата кнопка Cancel, кнопка Закрыть или клавиша <Esc>", result)
UPD
оказывается, что бы доступ к field() работал нужно переопределить метод initializePage() в том классе-странице визарада, где будут использоваться переменные из других страниц
initializePage(self) — этот метод следует переопределить в классе, наследующем
класс QWizardPage, если необходимо производить настройку свойств компонентов на основе данных, введенных на предыдущих страницах. Метод вызывается при нажатии
кнопки Next на предыдущей странице, но до отображения следующей страницы.
def initializePage(self):
path = self.field("line1")
print('print from function = ', path)
пример рабочего кода на
overflow, так как тут из-за лимита символов не могу вставить