2010-09-21 11 views
9

Lo que estoy tratando de lograr es que un widget pueda existir en dos diseños diferentes, en este caso en QHBoxLayout y en QVBoxLayout. Estoy implementando un sistema que cambia dinámicamente entre los dos diseños cuando cambia la orientación de la pantalla de un dispositivo.Qt: Mismo widget Dentro de dos diseños diferentes

Actualmente estoy creando, digamos que un widget compuesto complejo llamado MyWidget y añadiendo en un dos diseños diferentes:

MyWidget *wgt = new QWidget(); 
QVBoxLayout vlayout; 
QHBoxLayout hlayout; 

vlayout->addWidget(wgt); 
hlayout->addWidget(wgt); 

Ahora imagina que ambos diseños están alojados dentro de un diseño 'root', y que este diseño de raíz puede cambiar de tamaño en un modo de 'paisaje' más ancho que alto, y en un modo 'retrato' más alto que ancho.

El widget MyWidget se muestra correctamente solo en el primer diseño en el que se agrega, y cuando se cambian los diseños, se muestra incorrecto o no se muestra.

No sé si tengo algún sentido aquí, pero este es mi problema. Tal vez cuando se llame al evento switch, se deben cambiar el tamaño de todos los widgets y diseños para que siempre se vea bien. El único problema es que no sé cómo.

+0

pregunta relacionada: http://stackoverflow.com/questions/2990283/qt-change-qwidget-layout – rubenvb

Respuesta

4

Esto no es particularmente fácil de hacer, pero es posible.

Antes que nada, recomendaría que realmente cree dos widgets diferentes, uno para el vertical y otro para el horizontal, y administre las cosas de esa manera. Si los datos de origen están separados de manera adecuada de la clase de UI, debería poder hacerlo sin demasiados problemas, pero incurriendo en cierta sobrecarga de memoria.

Una forma de hacer lo que desee sería completamente remove the widgets desde un diseño y agréguelos al otro cuando necesite cambiar la disposición en la pantalla, y cambie el diseño que se agrega al widget. Esto debería provocar que los mismos widgets se dibujen de una manera diferente.

Una forma diferente y más complicada de manejar esto (aunque potencialmente más eficiente) sería write your own layout y hacer que maneje los widgets de reorganización según el cambio de orientación.

+1

decidí escribir un método que se llama automáticamente cuando los cambios de orientación, que (después de la eliminación) se suma los widgets de nuevo en el diseño. – Gerstmann

12

Esta no es una solución general para cambiar diseños, pero es una solución fácil en su caso: simplemente cambie la dirección de la caja.

hlayout->setDirection(QBoxLayout::TopToBottom); 
// now your hboxlayout works as vertical layout 

hlayout->setDirection(QBoxLayout::LeftToRight); 
// and now it is horizontal again 
Cuestiones relacionadas