pyqt: как удалить элементы из QVBoxLayout? - PullRequest
5 голосов
/ 05 мая 2011

Я хочу многоцветный виджет выбора. У меня есть кнопка «+» и изначально пустой vbox. Когда нажимается +, он добавляет QHBoxLayout в vbox, содержащий кнопку «-» и 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:

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

Как мне это сделать? (Я из истории 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)

1 Ответ

7 голосов
/ 05 мая 2011

Попробуйте удалить из родительского виджета, а не макета.

QLayout не является родителем, родительский элемент для размечаемых виджетов фактически является родительским элементом макета. Для получения дополнительной информации и более ясного объяснения смотрите документацию по разметке Qt .

Чтобы удалить виджет, установите для его родителя значение Нет, как это:

widget = QWidget()    
layout = QVBoxLayout()

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

# later
btn.setParent(None)
...