pyqt: как удалить элементы из QVBoxLayout?

Я хочу многоцветный виджет выбора. Я делаю это с помощью кнопки «+» и изначально пустого vbox. При нажатии + к vbox добавляется QHBoxLayout, содержащий кнопку «-» и 3 счетчика. Когда нажата кнопка «-», я хочу, чтобы эта строка исчезла и все вернулось к тому виду, который был до добавления этой строки. Сейчас у меня есть следующий код:

    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 :

После этого вызова это вызывающий ' s обязанность придать виджету разумную геометрию или вернуть виджет в макет.

Как мне это сделать? (Я пришел из фона 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)
5
задан Claudiu 4 May 2011 в 21:21
поделиться