PySide: удаление виджета из макета

Я пытаюсь удалить виджет Qt из макета в приложении PySide.

Вот минимальный пример. Это виджет с 5 кнопками внутри, и предполагается, что средняя из них удаляется при нажатии:

import sys
from PySide import QtGui

app = QtGui.QApplication(sys.argv)
widget = QtGui.QWidget()
layout = QtGui.QVBoxLayout()
buttons = [QtGui.QPushButton(str(x)) for x in xrange(5)]

def deleteButton():
    b = layout.takeAt(2)
    buttons.pop(2)
    del b
buttons[2].clicked.connect(deleteButton)

map(layout.addWidget, buttons)
widget.setLayout(layout)
widget.show()
app.exec_()

На самом деле происходит следующее:

What actually happens

Кнопка не нажимается и явно не учитывается при расчетах макета. , но его изображение остается на месте.

Согласно документации Qt, правильный способ удаления всех объектов из макета:

while ((child = layout->takeAt(0)) != 0) {
    delete child;
}

Здесь я просто хочу удалить третью кнопку, поэтому я просто вызываю takeAt(2 ), а затем del bдля вызова деструктора этого элемента. Объект кнопки также .pop'd из списка кнопок, чтобы убедиться, что нет остаточной ссылки на объект. Чем мой код отличается от кода в документации Qt, который вызывает такое поведение?

21
задан Etienne Perot 28 March 2012 в 00:02
поделиться