Qt mediante código

Qt fue desarrollado como un framework multiplataforma utilizando el paradigma de programación orientado a objetos, por lo que cuenta con clases (atributos públicos y métodos) dedicadas a la generación de objetos gráficos y al control de la interacción entre ellos. A modo de introducción, se muestra un ejemplo que ejecuta el clásico mensaje Hola Mundo, utilizando algunas clases de Qt y el lenguaje de programación C++.


Tabla: Implementación Hola Mundo utilizando Qt
\begin{table}
\begin{center}
\lstset{
%aboveskip=8pt,
backgroundcolor=\color{...
...);
label->show();
return app.exec();
}
\end{lstlisting}\end{center}\end{table}


Mediante el código mostrado arriba se genera la ventana de la figura 1. En detalle, a través de las líneas 1 y 2 se incluyen las clases que implementan ventanas de aplicación y etiquetas, respectivamente. En una ventana de aplicación, típicamente se agregan barras de menú (QMenuBar), barras de herramientas (QToolBar), barras de estado (QStatusBar) y otros componentes, llamados widgets. En las líneas 5 y 6 se genera, en primer lugar, un objeto de QApplication llamado app, el que es inicializando a través de su constructor con las variables argc y argv, y posteriormente, un puntero de tipo QLabel llamado label, mediante el cual se crea un objeto inicializado con el string Hola Mundo. En la línea 7, se hace visible la etiqueta creada y, para finalizar, en la línea 8, se entrega el control de la aplicación a la ventana app, comenzando el bucle de eventos asociada a ella. Dado que la aplicación es extremadamente sencilla, la definición de la interfaz se programa directamente en la función main, no siendo una práctica habitual. Es recomendable crear los widgets de forma ``oculta'', para de esta forma evitar el ``parpadeo'' de la ventana.

Figura: Ejecución código cuadro 1
\includegraphics[scale=1]{fig/ejemplo1.ps}

Para conseguir un archivo ejecutable de la ventana en la figura 1, se debe compilar el código del cuadro 1. Para ello Qt cuenta con herramientas que facilitan esta tarea. Los pasos a seguir para esto son mostrados abajo, donde la primera instrucción genera un archivo intermedio, con extensión .pro, que identifica al proyecto, la segunda genera un archivo Makefile, en el que se declaran reglas de compilación de la aplicación, y la última ejecuta las reglas antes mencionadas, generando una archivo binario en base a los códigos del proyecto.

aboveskip=8pt, backgroundcolor=lightGray, basicstyle=, numbers=none, breaklines=true,
\begin{lstlisting}
$ qmake-qt4 -project -o salida.pro
$\ qmake salida.pro
$ make
\end{lstlisting}

Una vez concluida la compilación, como se menciona arriba, se genera una fichero binario ejecutable con el nombre dado al archivo .pro, en este caso salida, el que puede ser arrancado mediante la instrucción numbers=none
\begin{lstlisting}
$\ ./salida
\end{lstlisting}

El ejemplo mostrado en el cuadro 1 no es de gran utilidad por sí solo, ya que no se generan interacciones con el usuario. Para esto, Qt implementa señales entre widgets, las que son utilizadas para controlar ciertas acciones de interés. En el código a continuación se agrega funcionalidad al ejemplo anterior para explicar este concepto.


Tabla: Implementación interacción básica entre widgets
\begin{table}
\begin{center}
\lstset{
%aboveskip=8pt,
backgroundcolor=\color{...
... button->show();
return app.exec();
}
\end{lstlisting}
\end{center}\end{table}


Así, mediante el programa en el cuadro 2 se genera la ventana mostrada en la figura 2, implementando un botón QPushButton que al ser presionado cierra la ventana QApplication que lo contiene. Las diferencias con el ejemplo anterior se encuentran en las líneas 2, 6 y 7. Así, en la línea 2 se incluye la cabecera de la clase QPushButton, en 6 se genera un puntero a la clase y se crea el objeto button, inicializandolo con el stream Quit, y en 7 se implementa la funcionalidad de QPushButton, utilizando para ello el método connect presente en el namespace QObject del framework Qt. En detalle, en la línea 7, se relaciona a button con app ejecutando la función SLOT(quit()) sobre app al emitirse la señal clicked() una vez presionado button. En general este es el método utilizado para generar interacción entre widgets por Qt, SIGNAL-SLOT. En base a las textitseñales (SIGNAL's) emitidas por un objeto, se ejecutan determinados SLOT's (en este caso quit()) de otros, realizando acciones previamente establecida.

Figura: Ejecución código cuadro 2
\includegraphics[scale=0.9]{fig/ejemplo2.ps}

Los ejemplos mostrados en este apartado explican el proceso básico de creación de las aplicaciones gráficas Qt, sin utilizar herramientas de ayuda para el programador, con el fin de comprender a nivel de código el procedimiento efectuado durante el desarrollo, permitiendo un mejor entendimiento una vez que se utilice QDesigner.

Cristian Duran-Faundez 2013-07-23