pyqt:如何从QVBoxLayout中删除元素?

Cla*_*diu 5 python qt qt4 pyqt pyqt4

我想要一个多色选择小部件.我这样做的方式是使用"+"按钮和最初为空的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)
Run Code Online (Sandbox Code Playgroud)

添加小部件工作正常.然而,删除它们导致一个看起来很乱的东西,其中行实际上没有被删除,但是间距都搞砸了.

我究竟做错了什么?

编辑:文档说,为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)
Run Code Online (Sandbox Code Playgroud)

Sau*_*tis 7

尝试从父窗口小部件中删除,而不是布局.

QLayout不是父级,布局小部件的父级实际上是布局的父级.有关更多信息和更清晰的解释,请参阅有关Qt布局的文档.

要删除小部件,请将其父级设置为无,如下所示:

widget = QWidget()    
layout = QVBoxLayout()

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

# later
btn.setParent(None)
Run Code Online (Sandbox Code Playgroud)