Programas para diagramas EER
Un problema que estoy encontrando durante el CUSL es la escasa oferta de programas de diagramas. En lo relacionado con el software (diagramas de paquetes, clases, flujo, casos de uso, etc...) existen algunos programas pero bastante arcaicos y con bugs importantes (me lo anoto para futuros desarrollos), pero de ellos hablaré en otra entrada. Hoy toca hablar concretamente del campo de las bases de datos y de los diagramas de EER, donde la cosa está más que cruda.
Buscando profundamente por "San Google" encontré que existe un programa llamado MySQL Workbench, que a su vez tiene una versión de la comunidad de usuarios con licencia OSS/GPL (perfecta para el CUSL) que permite implementar diagramas EER, mostrar las tablas de la base de datos según varios tipos de diagramas, etc. En teoría está integrado para MySQL pero se puede usar sin problemas para el simple diseño. Es bastante intuitivo, por lo que uno se adapta rápidamente y sin tener que buscar ninguna ayuda externa.
Os recomiendo que le echéis un vistazo. Saludos!
Primer sprint serio
Esta semana me la he planteado como el primer sprint serio de desarrollo del proyecto. La fase de requisitos y diseño están acabadas, por lo que toca implementación y, eventualmente, algún retoque en la fase de diseño. Más o menos está todo definido, por lo que se supone que no debería haber más problema que los que me pueda generar el crear GADA.
El que sea esta semana y no la próxima tiene una razón sencilla. La semana que viene empiezo la fase de desarrollo y estudio de la parte seria de la aplicación: dietas y alimentación. Hasta ahora el desarrollo se ha reducido a la administración de pacientes, usuarios e informes, por lo que queda el grueso del sistema. Además, el próximo lunes empiezo las reuniones con dietistas y nutricionistas, por lo que muchas de las horas de desarrollo se irán directamente al estudio y análisis de las necesidades y de pre-desarrollo de la parte que ya he comentado.
Por todo esto, las tareas que debo terminar esta semana son:
- Administración: Corregir la edición de datos y acabar las alarmas para los usuarios.
- Pacientes: Crear una sección para notas (para cada paciente) que escriba el dietista.
- Informe: Acabar la presentación de la información y la gráfica de peso del paciente. Crear el PDF de la información para imprimir.
- Opciones de BD: Acabar la edición de las tablas de Alergias, Empresa y Seguros Médicos.
La verdad es que el tiempo es reducido, y las últimas dos opciones son las menos urgentes. La cuarta, es totalmente prescindible por ahora. Pero hay que aprovechar.
Han llegado los refuerzos
En un intento de documentarme y aprender más y mejor sobre Qt, me decidí hace un tiempo a pedir a os reyes magos digitales un buen regalo: un libro. Pero no un libro cualquiera, lo que yo necesitaba era EL libro. En este caso se trata del mejor libro de C++ y Qt que hay en estos momentos: C++ GUI Programming with Qt4 (2nd Edition) de Jasmin Blanchette y Mark Summerfield. Yo me lo he comprado en inglés, porque me salía a mitad de precio via Amazon, pero creo que también está en español por unos 55-60€.
En el libro se explora C++ y Qt en tres partes diferenciadas. La básica, la intermedia y la avanzada. En la primera vemos como crear los primeros widgets, su comportamiento y realiza un primer programa de prueba. En la segunda parte, nos enseña como crear eventos, gráficos en 2D, Entrada/Salida, bases de datos, redes y XML. Por último, en la avanzada, realiza explicaciones detalladas sobre internacionalización, personalización de la aplicación, gráficos en 3D, programación embebida, etc.
La verdad es que lo recomiendo para todos los que estén empezando, pero aún más para aquellos que quieren tener un manual de referencia a nivel medio y avanzado. Además la presentación es exquisita: tapa dura, hojas bien impresas... un lujo.
Estructura del informe del proyecto
La documentación: esa gran desconocida.
En los tiempos en que vivimos, que nadie se lee ni el manual del mando de la tele ni para entretenerse en el baño, se hace muy necesario tener conocimientos de documentación, sobre todo si es de proyectos software. En el caso de GADA en particular (y de los demás proyectos en general), además de ser parte de los ficheros a entregar para el CUSL, considero muy importante una buena documentación, y no me refiero al simple hecho de explicar como se instala o se usa el programa, eso es sólo una pequeña parte de la documentación. Me refiero a documentar todo el proyecto, desde que es un boceto en la cabeza, hasta que adquiere forma y funcionalidad.
Creo que es imprescindible relatar el cómo, pero también el porqué de cada decisión tomada durante las distintas fases del desarrollo. La cuestión es: ¿Qué fases de desarrollo? En la ingeniería del software, podemos distinguir varias etapas o fases en el desarrollo. No todo se reduce a programar; es más, programar sólo es la consecuencia lógica de todas las demás fases. Las etapas (o fases) que creo que son fundamentales son:
- Planificación: Una buena planificación del proyecto, sabiendo qué herramientas de apoyo usaremos (SVN, LaTeX...), como se organizará la gente participante en el proyecto (sobre todo si es colectivo) y una primera idea de qué va a ser el proyecto, es fundamental para un buen inicio. Aquí es donde marcaremos las pautas a seguir.
- Pre-estudio: A pesar de no ser una fase fundamental, considero que es de bastante ayuda para tener una visión global de qué impacto puede tener aquello que vamos a desarrollar, en el entorno al que va destinado. Muchas veces es más importante una pequeña aplicación que cumpla con las necesidades de un grupo específico, que un gran sistema que intenta abarcarlo todo sin conseguirlo.
- Especificación de requisitos: Una vez que tenemos claro que va a suponer nuestro programa, viene una de las partes más importantes. Definir los requisitos que ha de cumplir. Muchos proyectos fracasan o sufren graves retrasos en su desarrollo por una mala especificación de requisitos. Aquí es donde decidimos qué debe hacer la aplicación, porque debe hacerlo y que implica la realización de esa tarea concreta.
- Diseño: La fase de diseño es otra de las más laboriosas. En este punto ya tenemos claro qué y porqué debe hacer el programa sus taras, por lo que nos debemos ocupar de solucionar el cómo va a realizar todo aquello que queremos y cómo va a comportarse tanto interna como externamente. Aquí definiremos el comportamiento de los elementos tal que bases de datos, diferentes módulos del programa, interfaz gráfica, interrelación con el usuario, etc.
- Implementación: Fase importante por el resultado, pero no tanto por lo que supone. En esta fase se produce el desarrollo de la aplicación, no es una fase crítica, ya que si se han resuelto las anteriores de forma óptima, no debe haber más sobresaltos que los propios de la programación.
- Fase de pruebas: Es importante que a la hora de entregar un producto software, se pasen una serie de pruebas básicas para comprobar que la fase de implementación se ha llevado a cabo correctamente. Aquí es donde se especificarán esas pruebas y se llevarán a cabo.
- Documentación: Personalmente no la considero estrictamente una fase de la ingeniería del software, pero por su importancia creo que merece ser nombrada e incluida en un buen planteamiento. Aquí es donde debemos especificar lo nombrado en los primeros dos párrafos de esta entrada, y en los seis puntos anteriores. Claro está que esta fase no se desarrolla en último lugar, sino que se va trabajando en ella a medida que pasamos por las diferentes etapas.
Bueno, espero que os haya servido como introducción, otro día pondré un ejemplo de qué partes concretas puede tener la documentación y como estructurarla. Obviamente, todo esto es desde mi punto de vista y no es una verdad universal. Cada maestrillo tiene su librillo.
Solución al problema de acentos en Qt
Muchas veces en Qt encontramos un problema enorme al utilizar las tildes o los caracteres especiales como la ñ o la ç. Hasta ahora no había podido solucionar el problema de la mala visualización de las letras a pesar de saber donde estaba el problema: en la codificación.
Por defecto Qt interpreta las QString y los argumentos de la funcion tr() como Latin-1, mientras que Linux usa UTF-8 como sistema de codificación. En el caso de Windows es ISO 8859-15. Lo que yo no sabía era como hacer que por defecto, todo el texto que paso por tr() o en las QString, sea con la codificación que yo quiera, y la solución ha sido QTextCode.
QTextCode es una clase que nos permite asignar la codificación de caracteres por defecto a nuestro programa. En mi caso el código lo he puesto en el main, y es el siguiente:
QTextCodec *linuxCodec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForTr(linuxCodec); QTextCodec::setCodecForCString(linuxCodec); QTextCodec::setCodecForLocale(linuxCodec);
Esto no influye para elegir nuestro idioma, salvo que queramos usar los carácteres chinos, japoneses y coreanos, así como el alfabeto cirílico y árabe. En ese caso deberíamos tener una función que especificara la codificación, al margen de las traducciones hechas con Qt-Linguist.
La barra de menú en Qt
Hoy toca lección de código y con todos ustedes: la barra de menú. Supongo que después de 3 días de parón habréis hecho los deberes de estudiar y leer documentación de Qt, por lo que a partir de ahora empezaré con la magra del asunto.
Como habéis podido ver por las capturas, en GADA existe una barra de menú típica de casi todos los programas, en la que podemos encontrar el menú File (Archivo), Edit (Editar), Options (Opciones) y Help (Ayuda). Pues bien la cuestión es cómo hacer para implementar esto, y la respuesta es muy sencilla.
Digamos que tenemos un programa con su correspondiente QMainWindow como pantalla principal. Pues en esta clase existe un método llamado menuBar() en el que podemos ir añadiendo las opciones de menu con sus correspondientes acciones que queramos tener. Este método se puede llamar donde y cuando queramos, pero recomiendo que sea en el constructor de la clase que tengamos. Para crear un menú simple podemos hacerlo con este código:
PantallaPrincipal::PantallaPrincipal() { fileMenu = new QMenu(); fileMenu = menuBar()->addMenu(tr("&File")); abrir = new QAction(tr("&Open..."), this); abrir->setIcon(QIcon(":/images/open.svg")); abrir->setShortcut(tr("Ctrl+O")); connect(abrir, SIGNAL(triggered()), this, SLOT(openPro())); fileMenu->addSeparator(); salir = new QAction(tr("&Exit..."), this); salir->setIcon(QIcon(":/images/exit.svg")); salir->setShortcut(tr("Ctrl+Q")); connect(salir, SIGNAL(triggered()), this, SLOT(close())); fileMenu->addAction(abrir); fileMenu->addAction(salir); }
Esto nos crearía una barra de menú que compartiría puntero con fileMenu. Es por eso que al modificar fileMenu, también añadimos las QAction a la barra de menú principal. Si quisiéramos añadir más opciones de menú, solo tendríamos que crear una nueva variable y llenar los campos:
. . .
optionsMenu = new QMenu();
optionsMenu = menuBar()->addMenu(tr("&Options"));
. . .
optionsMenu->addAction(. . .);Muchos os preguntaréis por el símbolo & delante de la palabra. Esto indica la letra que será la abreviatura por defecto (al pulsar Alt+_letra_) que activará la acción dada. En este caso al pulsar Alt+O, nos activará el menú Opciones.
Otras cosas que hemos visto son los métodos setIcon(QIcon) que añade un icono en el formato que queramos, y setShortcut(QString) que introduce un enlace rápido, en el caso anterior Ctrl+Q para cerrar el programa.
Una función que veremos más adelante es:
connect(abrir, SIGNAL(triggered()), this, SLOT(openPro()));
Primer programa en C++ y Qt
Doy por supuesto que se tienen unos conocimientos medios de programación general, de C++ y como mínimo, que sabemos que existe Qt y que nos hemos planteado e, incluso empezado, a leer algo de documentación. Es lo menos que puedo pensar para empezar a escribir algo de código por aquí, jejeje. Antes de empezar, eso sí, quiero hacer una breve introducción a Qt.
Qt como tal se compone de piezas: es como un gran puzzle en el que vas colocando los diferentes "elementos" (como pueden ser QTextEdit, QLable, ...). Existe multitud de elementos para Qt, que si tengo tiempo mañana (y sino el domingo) publicaré con imágenes para guiarse mejor. De momento decir que una aplicación en Qt se compone de un elemento QApplication (o derivados) en el que se ejecutan los diferentes "elementos". Lo normal en una aplicación es que sean del tipo QMainWindow o QWidget.
En el siguiente ejemplo, voy a poner un típico "hola mundo" en C++ y Qt. Veréis que es sumamente parecido a C++ puro, pero usando los elementos de Qt:
#include <QApplication>
#include <QLabel>
int main(int argc, char **argv)
{
QApplication programa(argc,argv);
QLabel label("Hola mundo!");
label.resize(150,30);
label.show();
return programa.exec();
}
Explicación de las líneas:
Primero agregamos las librerías que vamos a usar con "#include". Ya dentro del main, creamos una instancia de QApplication, una etiqueta con QLabel, le damos el texto y el tamaño, y la mostramos con el método show(). Por último, ejecutamos la aplicación. Una vez esto esto está claro, viene el momento de compilar con las siguientes instrucciones. Hago notar que el nombre del proyecto será el de la carpeta desde donde se compila:
$ qmake -project
$ qmake
$ make
Y ejecutamos con:
$ ./nombre_proyecto
Esto nos mostaría una ventana con esta forma
GADA usará los iconos Tango
Dado que no soy muy ducho en diseño gráfico, he estado mirando iconos que podía usar para GADA. Finalmente me he decidido a usar los iconos de Tango Desktop Project. Como se indica en su web, existe para ayudar en la creación de una GUI para software de código abierto y libre.
El tema de iconos de Tango está bajo el Dominio Público. La paleta de colores también y, además, las utilidades de nombres para los iconos están licenciadas bajo GPL. Esto provoca que sean usados por grandes aplicaciones entre las que cabe destacar Firefox, GIMP, Openoffice.org, VMWare y Pidgin, entre otros.
Aunque sean de dominio público, sí que colaboraré (no económicamente, por mis posibilidades) con publicidad y con promoción dentro y fuera de GADA. Para empezar aquí esta esta entrada para animar a muchos de los que ahora están empezando en el CUSL a qué les echen un vistazo.
Un buen manual de C++ y Qt
Antes de empezar a poner código en el blog, me gustaría que todos aquellos interesados en C++ y Qt, le echaseis un vistazo a la documentación de la web de Qt. El manual de Qt4 en su primera versión creo que se podía descargar desde la misma web de Qt, aunque ahora no lo he encontrado. De todas formas aquí tenéis una buena relación de títulos disponibles, siendo el más importante y fundamental el primero. Aunque pueda imponer al principio por el idioma, tiene unos ejemplos tan bien explicados y sencillos, que es muy fácil seguirlos y aprender.
Para el que no lo quiera en inglés, puede comprar la primera edición en castellano por unos 55€. Aunque si como yo, os da igual el idioma y queréis tener la última edición (2ª), en Amazon está disponible por 39€ al cambio, aproximadamente, lo cual es más que recomendable.
Cambios en la GUI (administración)
Después del comentario de shakaran en la entrada anterior. Me he decidido a leer y buscar más información sobre usabilidad y construcción de GUI intuitivas y lo más correctas posibles. El enlace que mencionaba shakaran es un manual de GUI para GNOME, pero exportable al resto de escritorios. Como todo, hay algunas cosas con las que no conjugo mucho, pero la mayoría sí que son acertadas.
Después de estar todo el día cambiando cosas (entre ellas punteros y más punteros), aquí pongo una captura de como ha quedado por ahora, la pantalla de GADA (en concreto la pestaña de administración). He simplificado bastante los botones, he añadido color a los campos obligatorios, he eliminado el panel de edición de la información de administrador, que ahora se abrirá al pulsar sobre "Edit". Como veis, ha quedado bastante más sencillo y agradable a la vista.
Por último, he de decir que el aspecto gráfico también ha cambiado. Más adelante lo cambiaré para que se adapte al sistema, aunque el que de momento hay, me gusta bastante. En la siguiente entrada contaré como empezar una aplicación de C++ y Qt y cómo añadir estilos.



