我想要一个多色选择小部件。我这样做的方式是有一个“+”按钮,和一个最初是空的vbox。当按下+时,它会向包含“-”按钮和3个微调框的vbox添加QHBoxLayout。当按下“-”按钮时,我希望该行消失,所有内容都恢复到添加该行之前的样子。我现在的代码是:
vbox = self.ui.color_layout #from QtDesigner
hbox = QtGui.QHBoxLayout()
remove = QtGui.QPushButton("-", parent=self)
remove.clicked.connect(lambda: vbox.removeItem(hbox))
rspin = QtGui.QSpinBox(parent=self)
gspin = QtGui.QSpinBox(parent=self)
bspin = QtGui.QSpinBox(parent=self)
hbox.addWidget(remove)
hbox.addWidget(QtGui.QLabel("R:", parent=self))
hbox.addWidget(rspin)
hbox.addWidget(QtGui.QLabel("G:", parent=self))
hbox.addWidget(gspin)
hbox.addWidget(QtGui.QLabel("B:", parent=self))
hbox.addWidget(bspin)
vbox.addLayout(hbox)
添加小部件很好。然而,删除它们会导致一个看起来非常混乱的事情,行实际上并没有被删除,但是间距都被弄乱了。
我做错什么了?
编辑:文件上说,对于removeWidget
:
After this call, it is the caller's responsibility to give the widget a reasonable geometry or to put the widget back into a layout.
我该怎么做?(我来自GTK背景…)
编辑2:我甚至跟踪了这些行并调用了takeAt
函数来删除它,但它仍然会变得一团糟。给什么?看起来布局被删除了,但是没有一个小部件。。。
编辑3:这也不起作用,只是用类似的方式把事情搞砸了:
vbox = self.ui.color_layout
hbox = QtGui.QHBoxLayout()
row_widget = QtGui.QWidget(parent=self) #dummy widget to hold this stuff
remove = QtGui.QPushButton("-", parent=self)
def remove_func():
vbox.removeWidget(row_widget)
remove.clicked.connect(remove_func)
rspin = QtGui.QSpinBox(parent=self)
gspin = QtGui.QSpinBox(parent=self)
bspin = QtGui.QSpinBox(parent=self)
hbox.addWidget(remove)
hbox.addWidget(QtGui.QLabel("R:", parent=self))
hbox.addWidget(rspin)
hbox.addWidget(QtGui.QLabel("G:", parent=self))
hbox.addWidget(gspin)
hbox.addWidget(QtGui.QLabel("B:", parent=self))
hbox.addWidget(bspin)
row_widget.setLayout(hbox)
vbox.addWidget(row_widget)
尝试从父窗口小部件中删除,而不是从布局中删除。
QLayout不是父级,被布局的小部件的父级实际上是layout的父级。有关更多信息和更清楚的解释,请参见documentation on Qt layouts。
要删除小部件,请将其父级设置为无,如下所示:
相关问题 更多 >
编程相关推荐