2010-03-10 17 views
6

¿Cuál es la mejor manera de "cambiar" un QGraphicsWidget por otro en una vista existente? Tengo un widget de vista de árbol y un widget de etiqueta, y quiero que ocupen el mismo espacio en diferentes momentos. Específicamente, cuando hay un error, quiero mostrarlo en la etiqueta, y cuando no hay ningún error, quiero mostrar el árbol.Intercambio de un widget con otro en Qt

me han tratado mediante programación ocultando y mostrando uno al otro con hide() y show(), pero el problema es que el widget oculto ocupa espacio en mi QGraphicsLinearLayout incluso cuando está oculta, dejando un espacio vacío. Alternativamente, supongo que podría agregar y eliminar los widgets del diseño, pero eso parece ser muy rígido, ya que implica un cambio en la propiedad de los widgets y tendría que registrar su posición en el diseño para poder insertarlos nuevamente. el lugar correcto.

En Java Swing, usaría un CardLayout para lograr esto, pero no veo un equivalente en Qt.

ACTUALIZACIÓN: Descubrí QStackedWidget. Sin embargo, estoy trabajando con un QGraphicsScene y, por lo tanto, mis widgets no heredan de QWidget, sino más bien de QGraphicsWidget, por lo que no puedo agregarlos a un QStackedWidget.

Respuesta

0

Cuando agrega un QWidget a un diseño, el propietario del diseño no se hará cargo de su widget. Tienes que agregar tu widget como hijo de otro QWidget para eso (Generalmente, pasa el elemento primario en el constructor del elemento secundario).

Así que la eliminación de un widget de la Lyout solo lo eliminará del comportamiento de visualización del propietario del diseño.

En su caso, puede quitar el widget del diseño y ocultarlo. Si desea volver a mostrarlo, muéstrelo y agregue el widget al diseño. Para insertarlo en el lugar correcto, debe guardar su lugar al eliminarlo.

Espero que ayude

+2

Usted está un poco equivocado sobre la propiedad de los widgets en el diseño: todos los niños se vuelven a instalar automáticamente cuando se instala el diseño en el widget a través del método setLayout. Por lo tanto, no es necesario que especifique widgets padre para hijos. – chalup

+0

Este es básicamente el enfoque de "mano dura" que describí en la pregunta. Espero algo un poco más directo. (Creo que chalup tiene razón en el tema de la propiedad. El documento de QGraphicsLinearLayout.removeAt dice que la propiedad se transfiere a la persona que llama.) –

+0

¿Ha intentado utilizar un diseño personalizado en el que se ignorarán los widgets ocultos durante el posicionamiento? Esto puede hacer el truco. –

2

¿Qué tal QStackedWidget?

La clase QStackedWidget proporciona una pila de widgets donde solo se ve un widget a la vez.

+0

En la primera pasada, parece ser la solución ideal. Pero estoy trabajando con un QGraphicsScene y mis widgets no heredan de QWidget, sino de QGraphicsWidget, por lo que no puedo agregarlos a un QStackedWidget. Actualizaré la pregunta para dejarlo en claro. –

+0

Eso me ayudó - ¡Gracias! – Jmoney38

1

Puede emular fácilmente un QStackedWidget por su cuenta. Cree su propio widget (como lo desee, ya sea desde QWidget o desde QGraphicsWidget y colóquelo donde desee que aparezcan los dos widgets diferentes. Coloque sus widgets allí y permita que controle cuál es visible. Con un poco de trabajo, incluso se podría hacerla lo suficientemente genérico para ser utilizado como una versión QGraphicsWidget de QStackedWidget.

+0

¿En qué se diferencia esto de mi primer intento de llamar a hide() y show() en los widgets? El problema es el espacio vacío que queda en el diseño donde reside el widget oculto. –

+0

@Rob H: La diferencia es que en este caso tiene un widget ocupando el espacio en su diseño lineal. Ese widget cambia lo que muestra, lo que no debería afectar el espaciado de nada a su alrededor. Dejé implícito que el widget que contiene los otros dos no debería usar un diseño, sino simplemente colocar los otros donde deberían estar, y mostrar/ocultar cada uno según corresponda. –

+0

Ahh, ahora lo entiendo. +1 para una idea interesante, aunque creo que voy a ir con la respuesta del diseño de anclaje si puedo hacerlo funcionar. –

1

hay algo llamado QGraphicsAnchorLayout. se define "anclas" (las distancias entre bordes o esquinas del material), para que pueda probar la definición de la misma anclas para su árbol y etiquete y oculte los widgets de forma adecuada. Dado que ambos widgets ocuparán la misma área, no debería haber ningún espacio después de ocultar un elemento.

+0

Hmm ... Lo investigaré e informaré. Gracias por el puntero! –

Cuestiones relacionadas