title: pyqt: how to remove elements from a QVBoxLayout?
body: <p>I want a multi-color selection widget. The way I'm doing it is having a "+" button, and an initially empty vbox. When + is pressed, it adds a QHBoxLayout to the vbox containing a "-" button and 3 spinboxes. When the "-" button is pressed I want that row to disappear and everything to go back to looking like it did before that row was added.  The code I currently have is:</p>
  
  <pre><code>    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)
  </code></pre>
  
  <p>Adding widgets works fine. However, removing them results in a really messed-up looking thing where the row isn't actually removed, but the spacing is all messed up.</p>
  
  <p>What am I doing wrong?</p>
  
  <p>EDIT: The docs say, for <code>removeWidget</code>:</p>
  
  <blockquote>
    <p>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.</p>
  </blockquote>
  
  <p>How do I do that? (I come from a GTK background...)</p>
  
  <p>EDIT 2: I even kept track of the rows and called the <code>takeAt</code> function to remove it, but it still gets messed up. What gives? It looks like the layout is removed but none of the widgets are...</p>
  
  <p>EDIT 3: this also doesn't work, just messes things up in a similar way:</p>
  
  <pre><code>    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)
  </code></pre>