2011-05-05 20 views
22

Tengo un widget QGroupBox con elementos secundarios que quiero eliminar. ¿Cómo puedo hacer eso? No puedo encontrar removeWidget, removeChild, removeItem, o algo similar en the docs. Solo puedo ver cómo eliminar elementos de un diseño, pero eso, al parecer, no lo elimina del widget real.pyqt: cómo eliminar un widget?

+0

¿Está buscando _just_ eliminar el widget de QGroupBox, o desea eliminar el widget por completo? –

+0

@Alex: elimínelo por completo – Claudiu

Respuesta

17

Bueno, esto funciona: en el widget Quiero eliminar, llamar widget.setParent(None). Me gusta cómo agregar un diseño agrega un widget al contenedor, pero eliminarlo de un diseño no ... es algo divertido.

+0

Debe comprender que un widget se crea de todos modos, ya sea que lo coloque en un diseño o no, y tiene un padre. Un diseño solo es responsable de organizarlo en la pantalla, no es un método confiable o incluso utilizable para mostrar y ocultar widgets –

+0

No veo una manera de agregar o quitar un widget (cualquier función de agregar/quitar widget) excepto por el diseños. agregar el widget a un diseño parece hacer que se muestre (lo que realmente hace es establecer el elemento primario del widget en el contenedor para el que está el diseño). esperaría que quitar ese mismo widget del mismo diseño hiciera que no se muestre (es decir, ponerlo nuevamente en el mismo estado que antes lo agregué al diseño). pero la única forma de hacerlo parece ser establecer el padre del widget en Ninguno ... que no es simétrico en absoluto. – Claudiu

+0

bueno, puedes usar el método 'removeChild' del padre, pero es mejor' ocultar' –

5

¿Seguro que quiere borrar realmente el widget? ¿No lo hará hide? En mi humilde opinión el método aceptado está utilizando show/hide para hacer los widgets aparecen y desaparecen de la vista del usuario.

Una alternativa es usar QStackedWidget

+0

sí; [Ver aquí] (http://stackoverflow.com/questions/5889705/pyqt-how-to-remove-elements-from-a-qvboxlayout/5890555#5890555). aunque supongo que esconderse podría funcionar también – Claudiu

+0

@Claidiu: si eso es lo que quieres, creo que la respuesta te da la solución –

+0

@Eli: la respuesta no me dice cómo quitar realmente el widget del padre, que es lo que estaba preguntando aquí. – Claudiu

32

Si tu widget no tiene widgets hijos que dependen de ella creo que se puede utilizar:

layout.removeWidget(self.widget_name) 
self.widget_name.deleteLater() 
self.widget_name = None 

en mis pruebas, cuando se trata de un widget que tiene niño que tienes que:

import sip 
layout.removeWidget(self.widget_name) 
sip.delete(self.widget_name) 
self.widget_name = None 

Si usted no tiene un nombre de variable para el widget en la clase o nivel mundial todavía se puede quitar de diseño con layout.takeAt (índice) y obtener el puntero del widget de la QLayoutItem funciona este método devuelve con QLayoutItem.widget(), en ese caso no necesita asignarle a None el nombre de la variable porque no es referenciado fuera de tu función.

Pruebe ambos métodos y vea lo que funciona para usted (no pierda la memoria después de repetir un buen montón de veces).

Cuestiones relacionadas