Layout lässt sich nicht vollständig verstecken

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Maddin
User
Beiträge: 2
Registriert: Sonntag 29. Mai 2016, 11:30

Hallo zusammen,
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()
Und hier die Funktion die immer bei einer neuen Auswahl bei der ComboBox aufgerufen wird:

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")
Und zu guter Letzt noch die Funktion mit der ich alle Layouts verstecke und dann wieder ein Layout einblenden will:

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)
BlackJack

@Maddin: Gibt es in Qt5 kein `QStackedLayout` mehr, oder warum versuchst Du das manuell nachzubauen?
Maddin
User
Beiträge: 2
Registriert: Sonntag 29. Mai 2016, 11:30

Ah okay genau das hab ich gesucht :D Doch das gibt es noch bei PyQt5, muss das wohl nur komplett übersehen haben. Vielen Dank!
Antworten