Proyecto Fin de Carrera

Robótica, software y telecomunicaciones.

GUI con QT4 en RoboComp

Las librerías QT de Nokia(antes Troltech) permiten crear una GUI (interfaz gráfica de usuario) para un programa con relativa facilidad, pero además de la GUI, estas librerías librerías tienen un toolkit muy completo, con máquina de estados, control de excepciones, tratamiento multimedia, etc.

RoboComp hace uso de las capacidades de QT4, tanto para la GUI como para otras tareas, por lo que si queremos crear una GUI para nuestro componente, lo mejor es hacerla con QT4.

Logo de QT

Para empezar, podemos ojear la información que nos da la propia Nokia aquí, sin embargo podemos usar QT Assistant que es un asistente con toda la documentación que necesitan los desarrolladores que usen QT. Como nosotros desarrollamos con KDevelop, tenemos la ventaja que este IDE (Entorno de Programación Integrado) integra a QT Assistant de forma que su uso es muy cómodo.

Siguiendo los tutoriales, uno se da cuenta que es muy fácil crear una primera GUI con QT4, más aún cuando usamos un programa de edición de GUI como QT Creator. Sin embargo a la hora de unir la GUI que puedes hacer siguiendo un tutorial, con el componente creado en RoboComp, parece que la tarea se complica.

En realidad no es tan complicado, los pasos son muy simples, crear un método SLOT, crear un widget con SIGNAL, y conectarlos.

El método SLOT no es más que un método (en C y otros lenguajes se llaman funciones) que tratará la comunicación con la señal, y se crea como cualquier otro método que queramos. Un ejemplo podría ser capturar el valor de un slider(barra desplazadora, fader), o ejecutar cualquier tarea al ser presionado un botón.

Para crear un método en RoboComp, primero lo declaramos en worker.h, debajo de public slots:

public slots:
void compute();
void pb_say_hello();

Luego lo desarrollamos en worker.cpp debajo de compute{}:

void Worker::pb_say_hello()
{   
   std::cout << "Hello!";
}

Con esto tenemos creado nuestro método SLOT listo para conectar a un widget con SIGNAL, el nombre pb_say_hello puede ser cualquiera, y el método puede tener argumentos de entrada o de salida, depende de nuestras necesidades, aunque sí suele ser conveniente que podamos identificar el método con la GUI, por ello pb_ hace referencia a “push button”, pero vale cualquier referencia.

El siguiente paso es crear el widget con SIGNAL, los widgets son cualquier elemento gráfico de una GUI, como una barra de desplazamiento, un botón, la caja de texto, un frame de video, texto no editable o la propia ventana que sujeta a todos los demás elementos. Los widgets con SIGNAL son aquellos que permiten la interacción del usuario con el programa, por ejemplo widgets con SIGNAL son los botones (dicen si están presionados o no al programa), las cajas de texto editable (pueden comunicar su texto al programa), o los sliders (pueden variar su posición), sin embargo los frames de video, los textos fijos o las ventanas que siven de soporte a otros widgets, no emiten SIGNAL.

Con QT Creator crear un widget es algo realmente sencillo, el único detalle que tenemos que tener en cuenta es darle un nombre al widget para que los podamos asociar cómodamente al método SLOT. De forma que en vez de tener botón1, botón2, botón3… tengamos say_hello_pb, stop_pb, close_pb…

Simplemente queda crear la conexión, ésta la hacemos en worker.cpp en el constructor. Si no sabeís qué es o dónde está el constructor, de forma rápida diré que en el constructor es donde se inicializan todas las variables que usemos y suele ser lo primero que encontramos en worker.cpp, se llama:

 Worker::Worker(...) : Qwidget(parent)
{
...
}

Entre esos corchetes será donde realizemos la conexión entre el método SLOT y el widget con SIGNAL. Según he visto en otros componentes de RoboComp, esto lo hacen al final del constructor, así que sería mejor seguir el orden y añadirlo en la parte baja del constructor. Quedaría así:

 Worker::Worker(...) : Qwidget(parent)
{
...
...
connect(  say_hello_pb,SIGNAL( clicked() ),this,SLOT( pb_say_hello() )  );
}

Como se puede advertir en la línea anterior, say_hello_pb es el widged, pues no lleva los paréntesis () característicos de los métodos. Además, say_hello_pb activa una señal cuando llama a su propio método clicked(), ya que un botón puede emitir una señal al dejar de pulsarlo, el nombre de estos métodos se pueden consultar de la información de QT, pero el propio KDevelop te ayuda sugiriéndote los métodos. Lo siguiente en aparecer es this, que se refiere a quién tiene el SLOT a conectar, en nuestro caso es worker, y cuando llegue la señal, se ejecutará el método pb_say_hello().

En principio con esto bastaría, y sería el proceso que hay que realizar para que cada widget de nuestra GUI pueda conectarse con nuestro componente, sin embargo antes de esto, deberíamos realizar algunas modificaciones, como añadir el .h de nuestra GUI en worker.h o modificar archivos como el ../etc/config o el ../src/CMakeLists.txt, esto lo contaré en otra entrada, pero si no queréis esperar podeís dejar un comentario con las dudas.

Anuncios

29 marzo 2011 - Posted by | all | , ,

1 comentario »

  1. […] componente con GUI En la entrada anterior explicaba cómo conseguir que una GUI creada con QT Creator se comunicase con nuestro componente, […]

    Pingback por Configurar componente con GUI « Proyecto Fin de Carrera | 29 marzo 2011 | Responder


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: