Pregunta Obtener los widgets de un diseño en PyQT


tengo un QVBoxLayout que he añadido algunos widgets a través de addWidget(). Ahora necesito eliminar esos widgets, y parece que necesito usar removeWidget() (que toma un widget para ser eliminado) para hacer eso.

Pensé que llamar children() o findChildren(QWidget) en mi diseño devolvería una lista de los widgets que he agregado en él; Sin embargo, estoy en el depurador y estoy recibiendo listas vacías.

¿Estoy terriblemente malinterpretando algo? Empecé a hacer PyQT la semana pasada y he estado aprendiendo a través de prueba y error con los documentos API.


5
2018-06-19 20:54


origen


Respuestas:


Eso es extraño. Mi entendimiento es que agregar widgets a través de addWidget transfiere la propiedad a la disposición para llamar children() debería funcionar

Sin embargo, como alternativa, podría recorrer los elementos de diseño utilizando count() y itemAt(int) para suministrar un QLayoutItem a removeItem(QLayoutItem*).

Editar:

Acabo de intentar addWidget con una aplicación de prueba C ++ recta. y no transfiere QObject la propiedad de la disposición de modo children() es de hecho una lista vacía. los documentos decir claramente que la propiedad se transfiere aunque ...

Editar 2:

De acuerdo, parece que transfiere la propiedad al widget que tiene ese diseño (que es no lo que decían los docs). Eso hace que los elementos en el diseño de los hermanos del diseño en sí en el QObject ¡jerarquía! Por lo tanto, es más fácil quedarse con count y itemAt.


10
2018-06-19 21:30



Para obtener un widget de un QLayout, debe llamar a su itemAt(index) método. Como lo indica el nombre de este método, devolverá un elemento en lugar de un widget. Vocación widget() en el resultado finalmente le dará el widget:

myWidget = self.myLayout.itemAt(index).widget()

Para eliminar un widget, configure el widget padre en None:

myWidget.setParent(None)

También muy útil es el QLayout count() método. Para buscar y borrar todos los contenidos de un diseño:

index = myLayout.count()
while(index >= 0):
    myWidget = myLayout.itemAt(index).widget()
    myWidget.setParent(None)
    index -=1

4
2017-08-24 09:53