2011-05-04 247 views
4

我想要一个多色选择小部件。我这样做的方式是有一个“+”按钮,以及一个最初是空的vbox。当按下+时,它会将QHBoxLayout添加到包含“ - ”按钮和3个旋转框的vbox。当按下“ - ”按钮时,我希望该行消失,并且所有内容都会恢复为在添加该行之前的样子。我现在拥有的代码是:pyqt:如何从QVBoxLayout中移除元素?

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

这一呼吁之后,这是调用者的责任给小部件合理的几何形状或把小部件回的布局。

我该怎么做? (我来自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) 
+0

更新我用一个例子回答。 – 2011-05-05 17:07:29

回答

6

尝试从母体取出小部件,而不是布局。

QLayout不是父级,正在布局的小部件的父级实际上是布局的父级。欲了解更多信息和更清晰的解释,请参阅documentation on Qt layouts

要删除插件,其父设置为无这样的:

widget = QWidget()  
layout = QVBoxLayout() 

btn = QPushButton("To be removed") 
layout.addWidget(btn) 
widget.setLayout(layout) 

# later 
btn.setParent(None) 
+0

什么是父窗口小部件?它在'QDialog'中,但它有任何形式的[没有删除功能](http://doc.qt.nokia.com/latest/qdialog-members.html)。也奇怪..我假设qdialog是一个容器。我看到一个“儿童”功能,但显然没有办法把孩子放在里面.. – Claudiu 2011-05-05 14:33:13

+0

我发现了父窗口小部件,但我该如何删除它?有没有'removeChild'或什么.. – Claudiu 2011-05-05 14:53:47

+1

啊好的,所以这是唯一的方法。 TY – Claudiu 2011-05-05 17:49:11