我有一个包含按钮的小部件/布局的对话框。我可以生成一个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)
答案 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
因此,如果要更改一组窗口小部件的布局,则必须动态执行此操作。但是,您应该知道,无论何时从网格布局中删除项目,逻辑行和列的数量都不会减少,即使可视行的数量或列可能会这样做。因此,最好每次都以新的布局开始,而不是尝试重新使用现有布局。