Qt + resources + fonts + stylesheets

A partir de esta entrega cambiaré el título de las anec-notas para reflejar mejor la temática y ahorrar espacio en la cabecera de la entrada: muchas veces estará en inglés (por eso de ser el idioma universal de la programación), quitaré el “anec-notas” del mismo y dejaré la indicación únicamente en la categoría del post.

Terminado este preámbulo, esta entrega mostrará una forma de incluir fuentes propias en un proyecto Qt, al menos la que más me gusta. Lo primero será ubicar el fichero de fuentes. Personalmente recomiendo utilizar un fichero de recursos (QRC) en el cual embeber la fuente:

<RCC>
 <qresource>
 <file>fuentes/mipropiafuente.ttf</file>
 </qresource>
</RCC>

Esta fuente deberá estar ubicada en “./fuentes/” respecto al fichero de recursos.

Antes de poder utilizar una fuente, hay que añadirla a la base de datos de fuentes de la aplicación. Para ello se usa la siguiente llamada:

QFontDatabase::addApplicationFont(":/fuentes/mipropiafuente.ttf");

A partir de este momento la fuente estará disponible en toda la aplicación. Bastará con especificarla en una hoja de estilos:

QWidget
{
 font-family: "Nombre real de nuestra fuente";
 font-size: 14px;
 color: #999999;
}

O directamente desde código:

// "pt" es un "QPainter *", seguramente un argumento del evento paint(...)

QFont fold(pt->font());
QFont fnew(fold);

fnew.setFamily("Nombre real de nuestra fuente");
fnew.setWeight(QFont::Bold);
pt->setFont(fnew);

// Escribir texto

pt->setFont(fold); // restablecer la fuente

Sugerencias finales sobre los stylesheets

Para agilizar la personalización de la interfaz sugiero cargar el fichero de estilos por fuera del fichero de recursos durante la etapa de desarrollo, y únicamente cargarlo desde el QRC cuando se pase a producción.

Además, si se están cambiando ficheros ya incluidos en el QRC, tales como imágenes, habrá que saber que los recursos de Qt sólo se re-compilan cuando el fichero .qrc es modificado, no cuando los ficheros incluidos lo hacen. Una buena técnica para automatizar este proceso es “tocar” el fichero QRC antes de cada compilación, al menos durante las pruebas de diseño de interfaz (la compilación de un QRC puede tomar su tiempo si los recursos incluidos son grandes). Para ello sugiero ver la entrada anterior sobre el comando touch en VisualStudio.

Anec-notas (IV)

Parece contradictorio que durante las vacaciones esté publicando más posts sobre mi trabajo que durante los meses laborales, pero qué le vamos a hacer, la vida es así.

Esta entrada la quiero dedicar al Visual Studio, así que allá vamos.

Implementar el comando “touch”

Unos de esos comando de UNIX que siempre me han gustado es el touch (para los que no lo conozcan, este comando modifica la cabecera de un fichero actualizando su fecha de modificación, creando el archivo si éste no existiere). Windows no tiene un comando equivalente a primera mano. Buscando un poco me encontré que se puede emular usando

copy /b <fichero> +,,

Donde es el nombre del fichero a “tocar” (pueden usarse comodines). Una limitación de este comando es que el fichero debe estar en el mismo directorio que el activo desde donde se ejecuta el comando. Ejecutar el comando siguiente no funcionará correctamente sino que copiará el fichero al directorio actual.

copy /b ..\config\game.ini +,,

La línea correcta en ese caso sería

copy /b ..\config\game.ini +,, ..\config\game.ini

Ahora bien, ¿a qué todo esto en Visual Studio? Imaginemos el siguiente escenario: estamos utilizando Qt y tenemos una hoja de estilos definida en un fichero QSS (Qt Stylesheet), el cual está incluido como recurso en un fichero QRC. Este fichero se recompila únicamente cuando se ha modificado, no cuando se han modificado los ficheros que incluye. Por lo que si estamos modificando continuamente el fichero de estilos tendríamos que “modificar” el fichero QRC para que se recompilase. En este caso el comando touch es un gran aliado. Para automatizar esta tarea podemos recurrir a los “Build Events”, más específicamente al “Pre-Build Event”. Está ubicado en “Project Properties > Build Events > Pre-Build Event”, donde especificamos el comando a utilizar (el ampersand “&” es un separador de comandos para poder indicar varios comandos uno a continuación de otro):

cd Resources &amp; copy /b *.qrc +,,

Los “Build Events” sólo permiten ejecutar un único comando (línea), por lo que si queremos realizar varias tareas lo mejor será definir un fichero por lotes que las ejecute. Otro detalle a tener en cuenta es que los ficheros QRC pueden tardar cierto tiempo en compilarse si contienen muchos recursos, especialmente imágenes, por lo que es conveniente que este evento sólo esté presente en una configuración de proyecto, tal como la Debug, o crearnos una especial.

Detalles de usabilidad

Acá me gustaría criticar comentar un detalle en la pantalla de creación de nuevos proyectos.

Nuevo proyecto VS

Resulta que en los campos de “Nombre” y “Nombre de la solución”, este cuadro de diálogo comprueba si el texto introducido es ““, en cuyo caso desactiva el botón “OK”. Probad vosotros y borrad una letra para que veáis cómo podéis crear el proyecto. Re-escribid esa letra y el botón “OK” se desactivará. ¿Tantos avances que se han hecho en usabilidad y no podían usar la propiedad “placeholder” en este caso?

Esto es inflación y lo demás son tonterías

Organizando fotos esta mañana encontré este par de capturas de pantalla que hice hace tiempo, instalando una actualización de Microsoft Office.

No tengo palabras para definir la impresión que me dio el pasar de necesitar 781KB… ¡a que la actualización pesara casi 300MB, y eso en un sólo click! Una inflación del 500%, nada que envidiar a muchos países.

officeupdate1

officeupdate2