Tengo todo tipo de problemas de tamaño con Qt. Estoy creando mis propios widgets y usando diferentes diseños (en general, necesito los míos para que funcionen correctamente sin pasar horas en los diseños predeterminados "poderosos" ... que no presentan las cosas como estaba previsto).¿Qué hace que un widget Qt y su diseño se comporten correctamente (en relación con su tamaño)?
Sin embargo, una vez que he terminado con un widget y su diseño, no funciona bien. El tamaño nunca se establece correctamente a menos que llame al widget->resize(1, 1);
, lo que finalmente fuerza un "cambio de tamaño" y hace que el widget se vea correcto (es decir, vuelva a calcular la geometría). Incluso la llamada updateGeometry()
no tiene ningún efecto.
Este es un problema terrible cuando se necesita llamar al resize()
en el widget principal (¡asco!) Y de lo que estoy leyendo no debería ser necesario si los diseños estuvieran programados correctamente.
¿Hay una muestra que funcione y no tenga varios miles de líneas de longitud, o Qt necesita varios miles de líneas para que todo funcione a la perfección, incluso el widget más simple?
¿Cuáles son las funciones mínimas que se deben llamar para hacer que un widget & funcione a la vez?
Gracias. Alexis
P.S. Traté de implementar el sizeHint()
, minimumSize()
, maximumSize()
, otros que me falta? Esperaba que eso fuera suficiente. Obviamente, también implemento el setGeometry()
en el diseño para cambiar el tamaño de los niños de forma adecuada.
--- además 1
Hay una imagen de la muestra con un diseño que claramente no está disponible al igual que en Qt. El posicionamiento, las funciones y los colores de las diferentes claves están basados en XML y funcionan para cualquier teclado del mundo.
(nota, esta muestra no muestra la tecla Intro se muestra en dos filas y más ancha por debajo que en la superior, más o menos, no es factible en absoluto con los diseños regulares; por supuesto, trabaja con mi versión.)
--- aclaración
no estoy muy seguro de cómo describir mejor el problema. Estaba pensando en escribir un widget de prueba al lado para ver cómo puedo reproducir el problema y luego publicarlo y finalmente arreglarlo. 8-)
La función de diseño predeterminada que utilizan los diseños internos de Qt requiere una gran cantidad de codificación. Me gustaría evitar tener que copiar/pegar todo eso porque para el mantenimiento lo hace casi imposible.
--- hallazgos de hoy
Como necesitaba para modificar uno de los widgets, he decidido añadir un VBoxLayout
y hacer que funcione.
De hecho encontré el problema ... Uno de los widgets en mi árbol es un QScrollArea
y ese sizeHint()
devuelve (-1, -1). No es exactamente lo que esperaba, pero ... lo que sea que pongas dentro de ese widget, es mejor que sepas cómo calcular su ancho y alto, o de lo contrario ... falla.
Mirando el código de cerca, podría calcular el ancho utilizando el ancho más ancho encontrado. Una vez que lo usé, el widget aparecería (y en realidad cambia de tamaño a medida que las cosas cambian en la lista, algo genial).
Dicho esto, mi comentario anterior acerca de tener un árbol de widgets que cambia automáticamente de tamaño se encuentra. Desde la raíz hasta los padres de las hojas en su árbol, todos los widgets necesitarán un diseño válido. Una vez que agregué uno en el widget superior, se redimensionó a sí mismo y a sus hijos correctamente (bueno ... en mi caso hasta el QScrollArea
, el resto requirió un cambio de tamaño de abajo a arriba. ¡Gracioso cómo funciona!)
--- ah! ¡decir ah! momento (o: lo que encuentras leyendo el código de implementación!)
Hoy me encontré con otro problema que solo necesitaba la llamada correcta ... No pude encontrar nada que valga la pena en la documentación.
Todos los objetos tienen un diseño ahora, pero un determinado elemento primario no se redimensionaría correctamente. Simple.
que tenía una llamada a los padres de la siguiente manera:
// changes to the children are changing the geometry
parentWidget()->updateGeometry();
Sí. Los documentos dicen que eso es lo que tienes que hacer. Nada sucede en absoluto con esa llamada. No tengo idea de lo que se supone que debe hacer, no miré esa función. De todos modos, nunca hizo nada por mí.
Entonces ... Miré el diseño para tratar de entender cómo se enviaría la información hacia arriba/abajo. No vi mucho a excepción de un interesante comentario:
// will trigger resize
Esto se dice del modo SetFixedSize
. Para llegar a esa función necesita hacer el diseño para la actualización. Ah! Sí ... el diseño, no el widget principal ... intentémoslo en su lugar:
parentWidget()->layout()->update();
Y listo! Cambia el tamaño correctamente en todos los casos que tengo. Es increíble que el widget updateGeometry()
no active el mismo efecto ...
¿Qué es lo que estamos tratando de lograr que el sistema de diseño incorporado no puede hacer por usted? Es difícil responder a una pregunta que te será útil cuando, en esencia, se reduce a "¿cómo hago que las cosas funcionen?" – Chris
Para las consultas de GUI/Diseño, incluida una captura de pantalla anotada, puede ayudar mucho. No hay escasez de personas aquí que les gusta resolver las cosas cuando tienen información sólida :) –
si no tienes un problema con tu código, entonces puedes compartirlo en www.ideone.com: D – blueskin