2011-08-24 9 views
5

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.

On screen keyboard

(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 ...

+2

¿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

+0

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 :) –

+0

si no tienes un problema con tu código, entonces puedes compartirlo en www.ideone.com: D – blueskin

Respuesta

1

Esto no lo ayudará con su problema inmediato, pero quería mostrarle un teclado que hice usando diseños y botones estándar. No es perfecto y aún no te ayudará con una tecla Intro que abarca dos filas, pero no está mal. También se puede redimensionar cambiando el tamaño de la ventana, aunque no estoy seguro si eso será evidente en las imágenes a continuación, ya que SO puede estar escalando. (Se puede ver las imágenes reales mediante la apertura de ellos en su propia pestaña)

enter image description here

enter image description here

De todos modos, esto se hizo utilizando sólo Qt Designer sin la codificación manual. Consiste en un diseño vertical de nivel superior con 5 diseños horizontales. Los botones se insertan en uno de los 5 diseños horizontales. El tamaño de las teclas se puede controlar estableciendo las políticas de tamaño horizontal y vertical como "ignoradas" para la mayoría de los botones y luego como "mínimo" horizontal para los botones que desee que sean más anchos. Las cosas se pueden modificar ajustando las restricciones de tamaño mínimo y máximo a los botones. Sin embargo, cuando cambian de tamaño, los botones no mantendrán sus proporciones relativas, lo que probablemente requiera cierta programación personalizada.

El estilo de su ejemplo se puede aproximar bastante bien utilizando hojas de estilo CSS e imágenes de fondo.Todavía no es un esfuerzo menor, pero debería poder obtener la mayor parte del camino sin diseños ni botones personalizados.

+1

Sí. Hay muchos problemas con QSS. Lo hace en cascada solo en la creación de los widgets. Después de eso, se olvida por completo de los padres. Entonces eso realmente no es tan práctico. Dicho esto, utilizo el QSS para los colores, bordes, tamaño de fuente, imágenes ... Ahora que lo pienso, me pregunto si mi problema podría ser realmente porque todos los antepasados ​​no incluyen un diseño. Creo que leí en alguna parte que para que los diseños funcionen bien los necesitas en todas partes. Finalmente, en mi caso, el teclado se puede cambiar a todo tipo de diseños. Por ejemplo, podría cambiarlo por un Kania o un teclado francés. –

2

Aunque es posible hacer lo que usted desea, parece que los problemas que está teniendo son porque está usando Qt de una manera que no debe ser utilizada. ¿Por qué necesita widgets separados para cada tecla representada en el teclado?

veo dos opciones, ambas de las cuales son mejores de alguna manera:

  1. Use QGraphicsScene y QGraphicsView.
  2. Un único widget personalizado que utiliza un dibujo personalizado para mostrar el teclado (y que probablemente se desplaza para obtener sugerencias).

La primera opción es probablemente mejor. Sus llaves podrían ser representadas por QGraphicsSimpleTextItem o incluso QGraphicsSvgItem. También proporciona una cantidad de diseños estándar o puede elegir write your own layout. De manera predeterminada, puede usar keyPressEvent o mouseReleaseEvent para responder a las interacciones del usuario.

Recomiendo encarecidamente que eche un vistazo a QGraphicsView examples para tener una idea de lo que puede hacer.

Si usted va la segunda ruta que necesitará para registrar los diferentes lugares clave para que pueda responder en consecuencia cuando el usuario mueve el ratón, clic, etc.

+0

¿Tendría que renderizar todo a mano en este caso? Con los PushButtons obtengo el renderizado gratis y el evento clicked() ... También mi teclado era un ejemplo, el problema que tenía estaba en una lista donde la cadena de diseño se rompe debido a la QScrollArea (es decir, debajo del QScrollArea el el tamaño no está limitado en altura, queremos redimensionar el widget dentro de QScrollArea lo más alto posible. Pero QScrollArea tiene que ser un tamaño razonable para este propósito.) –

+0

Publicación editada por comentarios. –

Cuestiones relacionadas