python - PySide: eliminar un widget de un diseño
qt qlayout (1)
Solución super simple:
def deleteButton():
b = layout.takeAt(2)
buttons.pop(2)
b.widget().deleteLater()
Primero debe asegurarse de que está dirigiendo el botón real y no el QWidgetItem que se devuelve desde el diseño, y luego invocar deleteLater (), que le indicará a Qt que destruya el widget una vez que este pase finalice y el control regrese al bucle de evento.
Otro ejemplo ilustra por qué el problema está ocurriendo. Aunque tome el elemento de diseño, el widget subyacente todavía está emparentado con el widget de diseños original.
def deleteButton():
b = layout.takeAt(2)
buttons.pop(2)
w = b.widget()
w.setParent(None)
Esta no es la forma preferida, ya que aún deja ambigua la limpieza del objeto. Pero muestra que borrar al padre le permite salir de la pantalla visual. Use deleteLater()
aunque. Limpia apropiadamente todo.
Estoy tratando de eliminar un widget Qt de un diseño en una aplicación PySide.
Aquí hay un ejemplo mínimo. Es un widget con 5 botones, y el del medio se supone que se elimina al hacer clic:
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_()
Lo que realmente sucede es esto:
El botón no se puede hacer clic y claramente no se tiene en cuenta para los cálculos de diseño, pero su imagen permanece en su lugar.
De acuerdo con la documentación de Qt , la forma correcta de eliminar todos los objetos de un diseño es:
while ((child = layout->takeAt(0)) != 0) {
delete child;
}
Aquí solo quiero eliminar el tercer botón, así que solo llamo a takeAt(2)
y luego a del b
para llamar al destructor en ese elemento. El objeto del botón también es .pop
''d de la lista de buttons
para asegurarse de que no haya referencias sobrantes al objeto. ¿Cómo difiere mi código de uno en los documentos de Qt que causaría tal comportamiento?