Использование в QStackedWidget Qt5 внешних компонентных виджетов
Есть вопрос по использованию в QStackedWidget Qt5 внешних компонентных (сложных по составу) виджетов.
Задача - сделать основную форму с переключением в ней типов подформ в зависимости от положения контрольных элементов (в данном случае - наборов радиокнопок) в основной форме.
Дизайн основной формы (тип QDialog) и "внешних" виджетов (тип QWidget) разработаны в Qt Designer.
Используются PySide2 и и загрузка дизайна форм и виджетов через QUiLoader().
В конструкторе основной формы в StackedWidget добавляются страницы из созданных в нём же экземпляров объектов подформ.
Радиокнопки управляют индексом стека через метод setCurrentIndex. Управление работает, что проверялось выводом результата методом currentWidget() вида <forms.X1Subform(0xc8158f0) at 0x0000000014073600>
Но при этом в стековом виджете главной формы подформы не отображаются - выводится пустое поле, при том что единственная страница, созданная в QTDesigner для отладки, отображается, а вот "боевые" не хотят...
При работе ранее в PyQt5 вроде бы удавалось отобразить, но после смены стека увы... В чем может быть причина?
В ответ на высказанное требование могу сообщить следующее:
Сложно представить содержимое нескольких файлов, в т.ч. описывающих дизайн Qt Designer, представленное в виде "минимального кода".
Поэтому попробую сформулировать задачу.
Есть процедура с входными и выходными данными общего типа, но с несколькими (у меня пока 6) вариантами ее проведения, имеющими разные наборы параметров и разные алгоритмы обработки данных. Поэтому возникла идея реализовать форму, управляющую входными и выходными потоками и выбором варианта алгоритма обработки, а так же набор объектов-подформ, реализованных каждая со своим набором управляющих элементов и методами обработки данных, которых активировать в главной форме в зависимости от выбора в главной форме.
В качестве контейнера таких подформ был выбран QStackedWidget.
Реализовывать каждую из форм на отдельной странице, вставленной изначально в объект-контейнер в главной форме, конечно, можно, но это сильно усложняет ее, особенно в части алгоритмов и возможностей дальнейшего расширения вариантов обработки данных в виде дополнительных подформ.
Вот этот вариант я пытаюсь реализовать. При работке с PyQt5 где дизайн под/форм грузится "напрямую" в объект окна, проблем вроде бы не было, но вод в PySide загрузка ведется в свойство obj.ui и как это влияет на видимость я не понимаю, т.к. начал осваивать эту обертку над Qt совсем недавно, собственно как и сам Qt. В книгах и статьях описаны простейшие случаи, по ним все просто и все работает.
Очень схематично код можно представить следующим образом
class SampleCreateForm(QDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent)
self.ui = ui_loager.load('../ui/sample_create_form.ui', None)
subFormsWidget=self.ui.subformsStackedWidget
# Варианты форм для разных типов выборки
mus_cell_subform=MUSCellSubform(self)
mus_fi_subform=MUSFixIntSubform(self)
<...>
# Добавляем формы в стек
subFormsWidget.addWidget(mus_cell_subform)
subFormsWidget.addWidget(mus_fi_subform)
<...>
//обработка сигналов переключения радиокнопок
self.ui.sampleTypeButtonGroup.buttonClicked.connect(self.subform_selector)
def subform_selector(self):
//в коде здесь правило выбора форм в зависимости от положения радиокнопок
//для проверки можно изменять
index = 1
self.ui.subformsStackedWidget.setCurrentIndex(index)
class MUSCellSubform(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent=None)
self.ui = ui_loager.load('../ui/sample_mus_cell_subform.ui', parent)
// далее обработчики событий подформы и вызов метода data_transformer
def data_transformer():
<алгоритм преобразования данных для подформы 1>
class MUSFixIntSubform(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.ui = ui_loager.load('../ui/sample_mus_fi_subform.ui', parent)
// далее обработчики событий подформы и вызов метода data_transformer
def data_transformer():
<алгоритм преобразования данных для подформы 2>