Convirtiendo cadenas a booleanos de forma expresiva

Al almacenar y recuperar valores desde un JSON, XML o cualquier otra notación de datos, es frecuente encontrarnos con la necesidad de convertir booleanos a cadenas y viceversa. En términos generales no es una operación complicada, y seguramente nos hagamos un par de funciones de ayuda similares a la siguientes:

Ahora, supongamos que, para facilitar la lectura del fichero y para ser más expresivos en su contenido, en lugar de "true" y "false", elegimos "yes" / "no" para unos casos, "show" / "hide" para otros, "enabled" / "disabled" en unos cuantos, etc. Nuestras funciones se complican un poco:

La interfaz del nuevo string2bool obvia el false_str por simplicidad: si no es el true_str pues será el false_str, ¿no? …

Sigue leyendo →

Poniendo el foco en… el foco

Hoy hablaremos de tres casos particulares en los que es conveniente alterar el comportamiento por defecto que tienen algunos controles de Qt al recibir el foco.

Breve introducción

Para los que no sepan qué es el foco, básicamente éste indica qué control va a recibir los eventos de entrada más importantes (como los de teclado), y se suele representar con un pequeño realce del color de los bordes o algún tipo de contorno. El foco puede obtenerse normalmente clicando sobre el control o pulsando repetidamente la tecla tabulador, aunque esto depende (en jerga Qt) de la política de foco (focus policy) que tenga el control.

Seleccionar todo el texto al mostrar el formulario

El más sencillo de los …

Sigue leyendo →

Navegando rápidamente por el código (parte I)

Como dicen muchos autores, escribir código no es lo único que hace un programador, un programador lee mucho código. Además, la mayor parte de ese código (casi la totalidad) no la hemos escrito nosotros. No, ni siquiera en esos proyectos en los que somos el único desarrollador. ¿Cuántos os acordáis de todo el código, con sus más íntimos recovecos, explicaciones y casos borde, que habéis escrito en los últimos… 6 meses? ¿4 semanas? ¿5 días? ¿el viernes? Lo normal es solucionar problemas, refactorizar código, hacerlo mejor, agregar nuevas funcionalidades, documentarlas… y lo normal es no acordarnos de todo. No digo olvidarlo todo, pero sí que es normal que nos olvidemos de cosas, del nombre exacto de una función o clase, …

Sigue leyendo →

Propiedades dinámicas de Qt y algunos usos en interfaces de usuario

Qt ha implementado, como parte de la la estructura de meta-objetos, un sistema de propiedades bastante completo y potente. Como resumen rápido, y dejando muchas cosas en el tintero, se trata de una forma de guardar datos a nivel de objeto sin tener que modificar su implementación, es decir, de forma dinámica:

  • Podemos darle un valor mediante objeto->setProperty("nombre", valor), donde valor es un QVariant.
  • Podemos leer el valor almacenado usando objeto->property("nombre") (devuelve, de nuevo, un QVariant).
  • Por último, podemos borrar la propiedad pasando un QVariant nulo: objeto->setProperty("nombre", {}).

En esta entrada comentaremos algunos usos de las propiedades durante la implementación de interfaces gráficas de usuario: como ayudante de máquinas de estado, indicar el estado de un …

Sigue leyendo →

Palíndromos 02022020

Además de ser el Día de la Marmota, el día de hoy nos presenta una fecha especial, un palíndromo: 02022020. Un palíndromo es un texto que se lee de igual forma en un sentido que en otro: ANA, amor a Roma (salvando la mayúscula), oso, ojo…

Hoy dedicaremos un artículo básico sobre cómo comprobar si un texto es palíndromo o no. Es un buen ejercicio cuando se comienza a programar y he querido dedicar unas líneas al mismo con algunas soluciones. En términos generales, todas implican comparar el primer caracter con el último, el segundo con el penúltimo y así hasta llegar a la mitad o encontrar uno diferente.

Por simplicidad, diferenciaremos mayúsculas de minúsculas así como letras …

Sigue leyendo →

Devolviendo cadenas, los punteros colgantes de Babilonia

En mis clases de Sistemas Operativos suelo dedicar un apartado a problemas de gestión de memoria, especialmente en el lado del programador: pérdidas de memoria (memory leaks), accesos fuera de límites (out-of-bound access), punteros colgantes (dangling pointers), entre otros. De los dos primeros ya hablaremos en otra ocasión, esta entrada versará sobre el último, los dangling pointers.

Un puntero colgante es, básicamente, un puntero que contiene una dirección de memoria inválida (cuando digo puntero me refiero también, si aplica, a referencias a objetos). Una dirección inválida puede ser:
– una dirección basura, normalmente un puntero sin inicializar,
– un puntero a una zona de memoria que ya no nos pertenece, tal como puntero …

Sigue leyendo →