Ich bastel mir gerade mit PyQt5 eine GUI und bin dabei auf ein Problem gestoßen. Und zwar will ich in einem Tab Optimierungsparameter für verschiedene Optimierungsalgorithmen anzeigen lassen. Dabei soll man ganz oben im Fenster mit Hilfe einer ComboBox einen Optimierungsalgorithmus auswählen können und dadrunter erscheinen dann die Simulationsparameter für den ausgewählten Algorithmus. Sprich wenn man dann in der ComboBox einen anderen Algorithmus auswählt werden auch dadrunter wieder andere Simulationsparameter anzeigt weil jeder Optmierungsalgorithmus unterschiedliche Parameter hat.
Habe mir das ganze dann so vorgestellt dass ich für die 4 verschiedenen Algorithmen 4 Layouts anlege und dann immer 3 Layouts "verstecke" und nur das benötigte Layout anzeige. Klappt auch soweit, allerdings scheinen die Layouts obowohl ich sie vertecke (soweit ich weiß kann man glaube ich nur die Widgets verstecken, nicht die Layouts selber) noch Einfluss auf das Fenster zu haben. Die erste Zeile der Layouts rutscht nämlich immer weiter nach unten je mehr versteckte Layouts sich darüber befinden. Es scheint also so als wenn die versteckten Layouts noch irgendwie ein wenig Platz beanspruchen und ich weiß nicht wie ich diesen beim verstecken komplett eliminieren kann.
Hier der Code der die 4 Layouts untereinander erzeugt: (self.LayoutParameterAlgorithm ist dabei das Basislayout)
Code: Alles auswählen
# Selection of the algorithm
self.ComboBoxParametersAlgorithms = QComboBox()
self.ComboBoxParametersAlgorithms.addItems(["QP / MILP / MIQP", "Dual Decomposition", "ADMM", "Rob. Opt. + Cost Function"])
self.ComboBoxParametersAlgorithms.currentIndexChanged['QString'].connect(self.UpdateAlgorithmSelection)
self.LayoutParametersAlgorithm.addRow(self.ComboBoxParametersAlgorithms)
# List of the algorithm property layouts
self.LayoutParametersAlgorithmList = []
self.LayoutParametersQP = QFormLayout()
self.LayoutParametersDD = QFormLayout()
self.LayoutParametersADMM = QFormLayout()
self.LayoutParametersROCF = QFormLayout()
self.LayoutParametersAlgorithmList.append(self.LayoutParametersQP)
self.LayoutParametersAlgorithmList.append(self.LayoutParametersDD)
self.LayoutParametersAlgorithmList.append(self.LayoutParametersADMM)
self.LayoutParametersAlgorithmList.append(self.LayoutParametersROCF)
# --------------------------------------------------------
# Add Layout for QP / MILP / MIQP
# --------------------------------------------------------
LayoutRadioButtons = QHBoxLayout()
self.RadioButtonParametersQPTypeQP = QRadioButton("QP")
self.RadioButtonParametersQPTypeQP.setChecked(True)
self.RadioButtonParametersQPTypeMILP = QRadioButton("MILP")
self.RadioButtonParametersQPTypeMIQP = QRadioButton("MIQP")
LayoutRadioButtons.addWidget(self.RadioButtonParametersQPTypeQP)
LayoutRadioButtons.addWidget(self.RadioButtonParametersQPTypeMILP)
LayoutRadioButtons.addWidget(self.RadioButtonParametersQPTypeMIQP)
LayoutRadioButtons.addStretch()
self.CheckboxParametersQPScaleUpRenewable = QCheckBox()
self.CheckboxParametersQPForceSOC_End = QCheckBox()
self.CheckboxParametersQPUseObjectives = QCheckBox()
self.DoubleSpinBoxParameterQPTimeLimit = QDoubleSpinBox()
self.DoubleSpinBoxParameterQPTimeLimit.setRange(1, 10000)
self.DoubleSpinBoxParameterQPTimeLimit.setDecimals(0)
self.DoubleSpinBoxParameterQPTimeLimit.setSingleStep(1)
self.DoubleSpinBoxParameterQPTimeLimit.setValue(600)
self.LabelParameterQPType = QLabel("Optimization type:")
self.LabelParameterQPScaleUpRenewable = QLabel("Scale-up renewable power")
self.LabelParameterQPForceSOC_End = QLabel("Force E_Storage[T] = SOC_End")
self.LabelParameterQPUseObjectives = QLabel("Use cost objectives")
self.LabelParameterQPTimeLimit = QLabel("Time limit")
self.LayoutParametersQP.addRow(self.LabelParameterQPType, LayoutRadioButtons)
self.LayoutParametersQP.addRow(self.LabelParameterQPScaleUpRenewable, self.CheckboxParametersQPScaleUpRenewable)
self.LayoutParametersQP.addRow(self.LabelParameterQPForceSOC_End, self.CheckboxParametersQPForceSOC_End)
self.LayoutParametersQP.addRow(self.LabelParameterQPUseObjectives, self.CheckboxParametersQPUseObjectives)
self.LayoutParametersQP.addRow(self.LabelParameterQPTimeLimit, self.DoubleSpinBoxParameterQPTimeLimit)
self.LayoutParametersAlgorithm.addRow(self.LayoutParametersQP)
# --------------------------------------------------------
# Add Layout for Dual Decomposition
# --------------------------------------------------------
self.LabelDD = QLabel("Dual Decomposition")
self.LayoutParametersDD.addRow(self.LabelDD)
self.LayoutParametersAlgorithm.addRow(self.LayoutParametersDD)
# --------------------------------------------------------
# Add Layout for ADMM
# --------------------------------------------------------
self.LabelADMM = QLabel("Alternating Direction Method of Multipliers")
self.LayoutParametersADMM.addRow(self.LabelADMM)
self.LayoutParametersAlgorithm.addRow(self.LayoutParametersADMM)
# --------------------------------------------------------
# Add Layout for Robust Optimization + Cost Function
# --------------------------------------------------------
self.LabelROCF = QLabel("Robust Optimization + Cost Function")
self.LayoutParametersROCF.addRow(self.LabelROCF)
self.LayoutParametersAlgorithm.addRow(self.LayoutParametersROCF)
self.UpdateAlgorithmSelection()
Code: Alles auswählen
def UpdateAlgorithmSelection(self):
ComboBoxIndex = self.ComboBoxParametersAlgorithms.currentIndex()
"""
Index | Algorithm
--------------------------------------------
0 QP / MILP / MIQP
1 Dual Decomposition
2 ADMM
3 Robust Optimization + Cost Function
"""
# At first make all widgets invisible and after it make the selected algorithm properties visible
for algorithmLayout in self.LayoutParametersAlgorithmList:
self.setAllWidgetsVisible(algorithmLayout, False)
# QP / MILP / MIQP
if ComboBoxIndex == 0:
self.setAllWidgetsVisible(self.LayoutParametersQP, True)
# Dual Decomposition
elif ComboBoxIndex == 1:
self.setAllWidgetsVisible(self.LayoutParametersDD, True)
# ADMM
elif ComboBoxIndex == 2:
self.setAllWidgetsVisible(self.LayoutParametersADMM, True)
# Robust Optimization + Cost Function
elif ComboBoxIndex == 3:
self.setAllWidgetsVisible(self.LayoutParametersROCF, True)
else:
print("Error occurred: Could not identify the selected algorithm")
Code: Alles auswählen
def setAllWidgetsVisible(self, layout, visible):
#layout.setContentsMargins(0, 0, 0, 0)
#layout.setSpacing(0)
#layout.setVerticalSpacing(0)
layout.setEnabled(visible)
items = [layout.itemAt(i).widget() for i in range(layout.count())]
children = layout.children()
for layout in children:
additionalItems = [layout.itemAt(i).widget() for i in range(layout.count())]
items += additionalItems
for widget in items:
if widget != None:
widget.setVisible(visible)
widget.setEnabled(visible)
widget.setHidden(not visible)