使用QStackedLayout查看不同的布局

时间:2016-02-18 18:55:30

标签: python pyqt

我有一个包含按钮的小部件/布局的对话框。我可以生成一个QHBoxLayout布局和一个QGridLayout布局。两者都很好。但现在我想为用户提供在两者之间切换的选项。所以我认为QStackedLayout与setCurrentIndex的单独机制将是正确的答案。遗憾的是,下面的代码只显示了一组按钮。我错过了什么,但我找不到什么。我希望我可以重用 - 而不是有两套 - QCheckBox。有2套会导致其他编程噩梦。

    # Check box's layout ... List
    checksLayoutW0 = QtGui.QWidget()
    checksLayout0 = QtGui.QVBoxLayout(checksLayoutW0)
    checksLayout0.setMargin(1)
    checksLayout0.setSpacing(1)      
    self.cbList = []
    for head in self.headers:
        show = not head.hidden and (not head.phase or (head.phase and self.phase))
        if show:
            head_str = str(head)
            checksItem = QtGui.QCheckBox(head_str)
            checksItem.setToolTip("Channel {}".format(head_str))
            checksItem.setObjectName(head_str)
            if head.phase:
                checksItem.setStyleSheet("QWidget {background-color:Green}")
            self.cbList.append(checksItem)
            checksLayout0.addWidget(checksItem)
    # End Check box layuout - List
    # Check box's layout ... Grid
    checksLayoutW1 = QtGui.QWidget()
    checksLayout1 = QtGui.QGridLayout(checksLayoutW1)
    checksLayout1.setColumnStretch(200,5)
    checksLayout1.setMargin(1)
    checksLayout1.setSpacing(1)      
    column_index = 0
    row_index = 0
    for checkbox in self.cbList:
            checksLayout1.addWidget(checkbox, row_index, column_index)
            if column_index < 4:
                column_index += 1
            else:
                row_index += 1
                column_index = 0
    # End Check box layuout - Grid
    self.checkerHlayout = QtGui.QHBoxLayout(self.scroll_viewWidget)        
    self.stackedLayout = QtGui.QStackedLayout()
    self.stackedLayout.addWidget(checksLayoutW0)
    self.stackedLayout.addWidget(checksLayoutW1)
    self.stackedLayout.setCurrentIndex(0)
    self.checkerHlayout.addLayout(self.stackedLayout)

1 个答案:

答案 0 :(得分:1)

窗口小部件不能超过布局。每当窗口小部件添加到布局时,它都会自动重新构建:

>>> w = Qt.QWidget()
>>> vbox = Qt.QVBoxLayout(w)
>>> x = Qt.QWidget()
>>> hbox = Qt.QHBoxLayout(x)
>>> b = Qt.QCheckBox()
>>> vbox.addWidget(b)
>>> b.parent() is w
True
>>> vbox.count()
1
>>> hbox.addWidget(b)
>>> vbox.count()
0
>>> b.parent() is x
True

因此,如果要更改一组窗口小部件的布局,则必须动态执行此操作。但是,您应该知道,无论何时从网格布局中删除项目,逻辑行和列的数量都不会减少,即使可视行的数量或列可能会这样做。因此,最好每次都以新的布局开始,而不是尝试重新使用现有布局。