2011-02-10 16 views
13

¿Cómo puedo obtener una vista previa del tamaño de los widgets en una ventana después de aplicar las reglas de diseño, antes de De hecho, show() la ventana de widgets? Parece que todos los tamaños son 100x30 antes del comando inicial show(). ¿Cómo voy alrededor de eso?Cómo obtener una vista previa de los tamaños de widgets en el diseño antes de un show()?

+0

¿Para qué necesitas esto? –

+0

MY own widget window class, examina el tamaño de los objetos y agrega widgets dinámicos en el momento de la construcción. Necesito medir los tamaños de cómo se verán las cosas DESPUÉS de un diseño en esa fase. – JasonGenX

Respuesta

9

El invalidate() funcionó para mí.

Tenga en cuenta que si lo hace lo siguiente que iba a funcionar como aquí se le preguntó (al menos parece estar bien en mi código):

widget->show(); 
widget->layout()->invalidate(); 
widget->hide(); 

Esto no muestra el widget en la pantalla, ya que Don ceda el control a la cola hasta que ocurra el hide(). Mientras tanto, el invalidate() calcula las posiciones correctas.

4

Usted podría tratar de google para "geometría qt antes del espectáculo", que muestra un hilo titulado Force geometry update of hidden widget en el foro qtcentre.org donde se puede leer Wysota respuesta:

Puede llamar invalidate() en el diseño. Debería recalcularse a sí mismo y luego. Si no es así, existe este atributo secreto que convence al widget que se muestra y luego debe ser capaz de forzar su diseño a recalcular. Pero pruebe otras cosas primero, esto no es algo muy confiable .

y esto

Qt :: WA_WState_ExplicitShowHide establece en verdadera y Qt :: WA_WState_Hidden establece en falsa. Asegúrese de revertir los valores (especialmente el segundo) antes de que muestre realmente el widget en la pantalla.

2

Utilice QWidget :: sizeHint para obtener el tamaño deseado del widget de nivel superior según el tamaño de todos los widgets y diseños infantiles. O llame a QWidget :: adjustSize para ejecutar realmente el diseño y cambiar el tamaño del árbol de widgets completo. Tenga en cuenta que adjustSize limitará las ventanas de nivel superior a 2/3 de la pantalla, por lo que es posible que no obtenga lo que desea para ventanas grandes.

6

Para mí, los siguientes trabajó:

window->layout()->update() 
window->layout()->activate() 

Esto probablemente hace lo mismo que la respuesta de Alexis, pero que no requiere mostrando-entonces-ocultar la ventana.

+0

¡Esto también me sirvió! Estaba tratando de centrar mi ventana en la pantalla. Estaba constantemente apagado hasta que agregué esas dos líneas justo antes de centrar la ventana. – Onlyjus

1

Me trataron las diversas soluciones publicadas por otros (show & hide, & updateactivate, invalidate y WA_WState_ExplicitShowHide & WA_WState_Hidden) pero ninguno era correcta con todos los widgets que tenía a centro antes de llamar show() en mi solicitud. Pasé horas cavando y mi problema fue que los tamaños incorrectos se almacenaron en caché dentro de QWidgetItemV2.Unos minutos más tarde se me ocurrió esto:

for(auto*child:widget->findChildren<QWidget*>()){child->updateGeometry();} 
widget->updateGeometry(); 
Cuestiones relacionadas