Signals y slots en Qt (parte II)

En esta segunda entrega de Signals y Slots, estudiaremos la nueva sintaxis introducida en Qt 5, así como una comparativa respecto a la forma antigua, y cómo resolver los principales problemas que puedan surgir.

Actualización: el código de ejemplo para esta entrada está ya disponible en GitHub (Part_2).

Qt 4

El método clásico descrito en el artículo anterior (el único en Qt 4 y anteriores), tiene básicamente dos desventajas:

  • No es posible hacer comprobaciones en tiempo de compilación (abriendo la puerta a muchos errores sutiles e indetectables errores, tales como escribir mal el nombre del slot). Los errores son sólo mostrados en tiempo de ejecución, por consola, y sin ningún tipo de assert ni nada parecido, por

Sigue leyendo →

Signals y slots en Qt (parte I)

Es normal que, para muchos, al hablar de Qt vengan a la cabeza dos palabras: signals y slots. Y es que Qt usa ampliamente este mecanismo de comunicación, muy similar al patrón observador, especialmente en lo referente a interfaces gráficas.

La documentación de Qt es muy extensa en el uso de este mecanismo, pero me ha parecido interesante resaltar algunos aspectos básicos y otros un poco menos obvios. Por su extensión, dividiré este artículo en dos entregas. En esta primera parte introduciré el uso más común y tradicional (el usado hasta Qt 4, aunque sea dentro del contexto de Qt 5), y en la segunda entrega pasaré a explicar las novedades introducidas en Qt 5, una comparativa …

Sigue leyendo →

Un breve tratado sobre la coexistencia de múltiples Q*Application

Breve historia de este post

Hace un par de años me tocó embeber el editor de interfaces de Qt (Qt Designer) dentro de otra aplicación. Si bien el cómo lo hice no tiene demasiada importancia ahora mismo, resulta que me enfrenté al siguiente problema: Qt Designer crea su propia instancia de QApplication, pero es que ¡la nueva aplicación contenedora también! Así que ante la clara pregunta ¿tendré problemas?, decidí estudiar el tema un poco más a fondo.

Antecedentes: QApplication

Un gran número de funcionalidades de Qt requieren de la existencia de un objeto especial, la aplicación: ésta gestiona los bucles de eventos, un gran número de variables globales (como el idioma actual), etc.

Dependiendo del modo de …

Sigue leyendo →

Efectos colaterales de los menús contextuales en Qt

Esta publicación es más bien corta y casi más a modo de para que no se me olvide que otra cosa, pero acá va.

Cuando se despliega un menú contextual en un widget de Qt, éste se apropia del mouse (grabMouse) lo que evita que los otros widgets que han solicitado seguir continuamente el movimiento del cursor (QWidget::mouseTracking) no reciban el evento mientras el menú contextual esté desplegado.

Como ejemplo práctico, imaginemos un widget que renderiza elementos gráficos propios, como un widget de OpenGL, y que mediante eventos MouseMove cambia el estado de los elementos que están debajo del cursor (como resaltar el elemento actual). Al desplegar el menú contextual para ese elemento, el widget deja …

Sigue leyendo →

Introducción a los QProxyStyle

Son muchos los momentos en los que es necesario cambiar detalles específicos de nuestra interfaz gráfica en Qt (usualmente la apariencia de un control). Qt ofrece muchas opciones al respecto:

  • Usar las propiedades del widget. Desafortunadamente no siempre están expuestas todos los parámetros de renderizado del control.
  • Heredar el control y especiar sus métodos de dibujado. Normalmente es la más complicada de las opciones.
  • Heredar y exponer las variables protegidas. Acá dos problemas: primero, que al no formar parte del API es más fácil que en futuras versiones de Qt se rompa la compilación; segundo, que muchos de los controles usan pimpl para ocultar los detalles internos.
  • Usar hojas de estilo (stylesheets): habitualmente es mi opción preferida, aunque

Sigue leyendo →

Usando tipografías propias en Qt

El dar un toque de distinción a nuestras aplicaciones puede pasar por utilizar tipografías que no son estándares, o que sólo vienen incluidas con instalaciones de determinados programas que no podemos asumir estén siempre presentes (ejemplo típico, MS Office, suites de Adobe…).

La opción más conveniente es la de incluirlas con nuestra aplicación (no hablaré de licencias ni nada parecido, asumo que todo está en orden). Para esto se pueden bien copiar junto al ejecutable, o incluir en un fichero de recursos (QRC). En cualquier de ambos casos habrá que registrar las fuentes antes de poder utilizarlas, especialmente si deseamos usarlas desde hojas de estilos.

Recordad que en Qt las rutas que empiezan por «:» pertenecen al sistema de ficheros …

Sigue leyendo →