PySideアプリケーションのレイアウトからQtウィジェットを削除しようとしています。
これが最小限の例です。これは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_()
実際に起こることはこれです:
ボタンはクリックできず、レイアウトの計算では明らかに考慮されませんが、画像はそのまま残ります。
Qtのドキュメントによると、レイアウトからすべてのオブジェクトを削除する正しい方法は次のとおりです。
while ((child = layout->takeAt(0)) != 0) {
delete child;
}
ここでは、3番目のボタンを削除したいので、takeAt(2)
をdel b
呼び出してから、そのアイテムのデストラクタを呼び出します。ボタンオブジェクトもリスト.pop
からbuttons
削除され、オブジェクトへの参照が残っていないことを確認します。私のコードは、そのような動作を引き起こすQtドキュメントのコードとどのように異なりますか?