qt parent qwidget qsplitter

qt - Cómo eliminar QWidgets de QSplitter



parent (6)

En mi aplicación, tengo una ventana dividida por un QSplitter, y necesito eliminar un widget.

¿Cómo puedo hacer eso? No puedo encontrar métodos útiles


Me gusta la respuesta de Tuminoid. Pero si realmente lo necesita, intente obtener el widget que desea eliminar y llame a setParent( NULL ) en ese widget. Esa es mi mejor suposición.


No me queda claro si desea conservar el widget y colocarlo en otro lugar, o si desea destruir el widget.

  • Destruir el widget: si puede obtener un puntero al widget, simplemente puede eliminarlo. El divisor se notificará con seguridad que su hijo se está eliminando y lo eliminará de sí mismo.

  • Preservar el widget: si agarra el puntero al widget, puede simplemente configurar su elemento primario para otro widget y agregarlo al diseño de otro widget y se mostrará allí. Esto es seguro porque se notificará al QSplitter que uno de sus hijos se está reparviendo.

Si desea establecer el padre en NULL (respuesta de cjhuitt) tenga en cuenta que ahora es responsable de limpiar esa memoria porque el widget ya no tiene un padre.


Si mantiene un puntero al widget, simplemente elimínelo o use deleteLater () si quiere estar seguro.

Si no tiene el puntero de widget, use la función QSplitter :: widget (int index). Luego, puede usar invocar su ranura deleteLater ().

Si no tiene el índice de widgets, pero aún conoce el widget objectName (), entonces QObject :: findChild () es su única forma de obtener el puntero del widget.


Otra forma fácil de evitar que el widget hijo sea eliminado es usar QSplitter.takeWidget (child). Esta es también la forma recomendada de eliminar el widget de un divisor. (Documentación de Qt)


Tuve el mismo problema. En Qt 4.8 para ocultar temporalmente uno de los widgets de un QSplitter simplemente lo oculto. Sin embargo, no es suficiente, ya que el asa del divisor aún está disponible para moverse. Pero también se puede acceder y ocultar el identificador:

frameA->setVisible(conditionA); frameB->setVisible(conditionB); if ( !(conditionA && conditionB) ) // if only 1 frame is visible { splitter->handle(0)->setVisible(false); }


Muchas cosas en Qt no pueden eliminarse "tradicionalmente". En su lugar, llame a hide () y destrúyalo. De la documentación QSplitter :

Cuando ocultas () a un niño, su espacio se distribuirá entre los otros niños. Se restablecerá cuando muestre () de nuevo.