You are on page 1of 16

02/10/2007

Introduccin a la programacin con Qt 4 en eclipse


Un ide libre y de calidad para desarrollo con Qt

Jhon James Quintero Osorio

Jhon James Quintero Osorio

Introduccin a la programacin con Qt 4 en eclipse


Introduccin
Hace muchos aos que le vengo siguiendo la pista a varios proyectos de software que me parecen interesantes, uno de ellos es Qt, librera con la que han sido desarrolladas varias aplicaciones, una de las ms significativas es KDE, el famoso y vistoso entorno de escritorio para Linux y otros Unixes. Despus de haber intentado compilar un proyecto simple en los siguientes entornos: QDevelop. MonkeyStudio CodeBloks

Y no conseguirlo, muy posiblemente por mi ignorancia y facilismo, me sent frustrado pues, como es posible que un framework tan maduro (en su versin libre) no tenga un buen entorno de desarrollo? Pues en una de mis visitas a la pgina de Trolltech, me encontr con que haban liberado la versin 1 del plugn de integracin QT eclipse para las versiones Qt 4.3.1 y eclipse 3.3 para C/C++.

Toolkits para construir GUIs


Donde los bits y las personas se encuentran
Negroponte, 1994

La mayora de las aplicaciones actuales se caracterizan por tener una interfaz de usuario agradable para el usuario (por lo menos as debera ser), adems la cantidad lneas de cdigo correspondiente a la interfaz de usuario se hace cada vez mayor, es por ello que la construccin de dichas interfaces desde cero es una labor que en la mayora de las veces no se justifica, pues muchas organizaciones, se han encargado de realizar desarrollos que permiten construir interfaces de muy buena apariencia rpidamente.

Jhon James Quintero Osorio

Existen diversos toolkits para la construccin de interfaces de usuario, entre las cuales podemos citar:

gtk(GIMP ToolKit, http://www.gtk.org). Librera realizada en C (orientado a objetos)


inicialmente creada para desarrollar el programa de manipulacin de imgenes GIMP, ahora usada en mltiples aplicaciones, GNOME por ejemplo. Caractersticas: o Multiplataforma (HPUX, SUN-Solaris, Linux, Windows, BeOs, ). Libre, licencia GPL Tiene como objetivos, Correccin, Rendimiento, Usabilidad.

o o

Figura 1 Aplicacin desarrollada con GTK.

Jhon James Quintero Osorio

WxWidgets. Es un toolkit de cdigo abierto, desarrollado en C++, para crear aplicaciones multiplataforma (Windows, Windows CE, Linux, Mac Os, ). Al estar programado en C++ aprovecha toda la versatilidad de la orientacin a objetos.

Figura 2 Aplicacin con WxWidgets.

Adems de los anteriores tambin se encuentran gtkmm, vtk, vcl, tcl,tk

Jhon James Quintero Osorio

Introduccin a Qt
La librera Qt es desarrollada por la empresa noruega TrollTech, con licencias tanto libre como comercial, desarrollada en C++ con aadidos. Las Qt a la fecha en sus versiones 4.X es un toolkit maduro que cuenta aproximadamente con 500 clases, ms de 9000 funciones y 500.000 lneas de cdigo y que le d al programador mucha de la potencia que le brindan lenguajes como C# o Java con la eficiencia de cdigo compilado en C++. Las Qt, al igual que otros toolkits no solo cuentan con clases para la construccin de interfaces de usuario, tambin incluyen soporte para dibujo en 2D, hilos, red, bases de datos, etc. La diferencia fundamental entre Qt y las otras libreras es que Qt le agrega al C++ estndar los conceptos de signal y slot, los cuales son similares en funcionalidad al concepto de callback (puntero a una funcin X que es pasado a otra para que sta ltima llame a X en el momento adecuado). Una de las caractersticas de las interfaces de usuario actuales es la flexibilidad, y si visualizamos cada uno de los elementos de la interfaz de usuario como un objeto lo que tenemos es un montn de objetos intercambiando informacin, es precisamente all donde la magia de las Qt tiene lugar, se define una seal/signal como un aviso que un objeto puede emitir cuando le ocurre algo (un cambio de estado importante, tambin denominado evento), un slot es un mtodo de un objeto que puede ser llamado cuando se genera una seal particular. Las clases que provee Qt poseen signals y slots predefinidos, sin embargo es muy fcil crear propios en nuevos tipos que deriven de la clase QObjetct.

Figura 3 Mecanismo de Signals/slots.

Jhon James Quintero Osorio

Instalando lo necesario
Primero veamos lo que necesitamos: 1. 2. 3. 4. 5. Es posible trabajar con cygwin o mingw, aqu se mostrar como hacer el montaje con mingw. Las libreras QT. Aqu las QT 4.3.1. Una maquina virtual de java, 5 o 6. Eclipse 3.3 europa para C/C++ El plugin QT para eclipse.

Instalando mingw
Es necesario del sitio web de mingw (usar un motor de bsqueda), bajar los siguientes instaladores: binutils. gcc-core. mingw-runtime. mingw-api gcc-g++. gdb mingw32-make

Generalmente estos archivos son archivos con extencin gz por lo cual es necesario utilizar un programa de descompresin como winrar, winace o cualquiera que soporte este tipo de compresin. Creamos un directorio digamos en C, llamado mingw y all descomprimimos los archivos mencionados. Es importante observar que para trabajar en C/C++ no es necesario instalar el make pues eclipse trae un sistema de manejo de proyectos, sin embargo los proyectos Qt utilizan make para construir el proyecto.

Instalando las Qt4.3.1


De la pagina de Trolltech, es posible bajar la ultima versin (4.3.1 a la fecha) de las libreras Qt, que nos permitirn desarrollar aplicaciones en C++, multiplataforma y con una muy buena apariencia. El instalador es un archivo ejecutable normal en Windows lo ejecutamos y obtenemos algo como:

Jhon James Quintero Osorio

Damos las instrucciones necesarias hasta que aparezca:

En donde indicamos la instalacin de mingw que vamos a usar, y listo (si sale un problema con w32api.h no hacerle caso y continuar tranquilos).

La mquina virtual de java


Pues ahora con las cantidades de espacio en disco y memoria ram de las computadoras no es mucho problema que se instale una mquina virtual de java con incluso todo el sdk, esto se consigue en la pagina de Sun microsystems, es posible usar la versin de 5 o 6 de java. Aqu no se describir la instalacin pues es en verdad muy simple.

Jhon James Quintero Osorio

Eclipse para C/C++


Eclipse ser el entorno en el cual deseamos desarrollar las aplicaciones en C++, como eclipse necesita de java para poder funcionar, lo instalamos despus de tener el entorno java instalado. La distribucin de eclipse que vamos a usar es eclipse-cpp-europa-fall-win32.zip que es especifica para desarrollar en C/C++, es decir no es necesario instalar ningn plugin adicional para los desarrollos bsicos.

Figura 4 Eclipse iniciando.

Al entrar a eclipse nos aparece una pantalla as:

Figura 5 Pantalla de bienvenida de eclipse C/C++

Despus de tener el eclipse instalado podemos crear nuestros primeros proyectos en C/C++, siguiendo el tutorial.

Jhon James Quintero Osorio

El plugin Qt para eclipse


Este plugin nos permitir desarrollar aplicaciones en C++ usando las libreras Qt, el plugin esta diseado para trabajar con la versin 4.3.1 de las Qt. En el sitio web de Trolltech tambin podemos bajar la versin del plugin para nuestro sistema, en nuestro caso qt-eclipse-integration-win321.0.0.exe, instalador que al ejecutarlo pedir la ruta de instalacin y la ruta del eclipse al que queremos integrarlo. Despus de ejecutar el instalador podemos lanzar el eclipse y nos preguntar que si deseamos abrir un recorrido por el desarrollo con Qt, si indicamos que si podremos configurar el plugin para que tome las libreras que instalamos en el segundo paso de este proceso.

Figura 6 Configurando el plugin con las instalaciones de Qt.

Programa de ejemplo en Qt 4 con Eclipse


Bien ahora que tenemos todo lo necesario para hacer nuestros programas en C++ con eclipse, vamos a realizar un ejemplo sencillo, un programa que realice el ajuste por mnimos cuadrados de un conjunto de datos atreves de una interfaz grfica de usuario. Para esta aplicacin supondremos que la gsl est instalada en en C:\mingw, aunque podran estar en cualquier parte y configurarlo en el proyecto.

Inicialmente entramos a eclipse y file, new, Qt Gui Projet, si no aparece buscarlo en other. Le damos un nombre al proyecto, eclipse creara un directorio para este con el mismo nombre del proyecto. Eclipse muestra un dialogo con el nombre de la primera Clase Qt del proyecto, generalmetne es mejor cambiarla y colocar un nombre que empiece por maysculas.

Jhon James Quintero Osorio

Figura 7 Wizard para el nombre y tipo de la primera clase Qt.

Luego el wizard nos pregunta si deseamos mdulos adicionales de las Qt. Si por alguna razn no hemos configurado las instalaciones Qt que tengamos, eclipse nos dir que si lo deseamos hacer.

Jhon James Quintero Osorio

Posiblemente si seleccionamos el proyecto y tratamos de construirlo encontramos problemas en la ejecucin de mingw32-make, esto se debe a que la ruta del mingw no ha sido configurada en el proyecto, para eso damos click sobre el proyecto, luego click izquierdo y seleccionamos propierties; en las opciones de C/C++ Make Project, seleccionamos la pestaa enviroment y agregamos a la variable PATH la ruta del directorio bin del mingw, presionamos Ok y luego de nuevo Ok en el dialogo mayor, y listo.

Ahora eclipse puede encontrar los ejecutables necesarios para construir la aplicacin. Si todo ha ido bien podemos seleccionar el proyecto seleccionar la opcin de ejecutar (ctrl-f11) si es la primera vez que lo hacemos para el proyecto nos aparecer un dialogo para seleccionar el tipo de lanzamiento que deseamos (a mi me funciona bien gdb/mi) y debemos obtener algo como lo siguiente:

Figura 8 La ventana principal de la aplicacin.

10

Jhon James Quintero Osorio

Bien ahora usaremos el editor de interfaces de usuario para disear la ventana principal, solo es necesario dar click sobre el archivo con extencion ui del proyecto. Trabajando un poco con los widgets podemos obtener algo como:

Dados que necesitamos tambin la librera gsl para realizar nuestro ejemplo utilizamos el editor visual del archivo de proyecto (extencin .pro), ese archivo es el que controla la totalidad del proceso de construccin de la aplicacin, dado que la librera gsl est en el directorio del mingw, debemos agregar a la ruta de los archivos de cabecera c:/mingw/include/gsl-1.8

Se agrega la ruta para los include

Figura 9 Configuracin del archivo del proyecto.

11

Jhon James Quintero Osorio

Despus de agregar la ruta para los archivos de cabecera es necesario tambin agregar las libreras para el proceso de enlace y su respectiva ruta, es importante indicar que la ruta debe escribirse ///, si con slash.

La ruta de la librera GSL, y los archivos necesarios para el enlace

Figura 10 Configuracin de libreras para el enlace.

Ahora el programa que funcionando:

A continuacin se muestra la implementacin de la clase principal del programa.

12

Jhon James Quintero Osorio

#ifndef PPAL_H #define PPAL_H #include <QtGui/QMainWindow> #include "ui_ppal.h" class Ppal : public QMainWindow { Q_OBJECT public: Ppal(QWidget *parent = 0); ~Ppal(); private: Ui::PpalClass ui;

private slots: void void void void }; #endif // PPAL_H addDatas(); delRow(); calc(); on_btnAdd_clicked();

13

Jhon James Quintero Osorio

#include #include #include #include #include

<QTableWidgetItem> <QString> <iostream> <gsl/gsl_fit.h> "ppal.h"

Ppal::Ppal(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); connect(ui.btnAdd,SIGNAL(clicked()),this,SLOT(addDatas())); connect(ui.btnCalcular,SIGNAL(clicked()),this,SLOT(calc())); } Ppal::~Ppal() { } void Ppal::on_btnAdd_clicked() { } void Ppal::addDatas() { QTableWidgetItem* item=0; bool st=false; // tratamos de convertir el valor en X ui.leX->text().toDouble(&st); if(st!=true) { return; } // tratamos de convertir el valor en Y ui.leY->text().toDouble(&st); if(st!=true) { return; }

//Se agrega una fila a la tabla ui.tbDatos->setRowCount(ui.tbDatos->rowCount()+1);

item = new QTableWidgetItem(ui.leX->text()); ui.tbDatos->setItem(ui.tbDatos->rowCount()-1,0,item); item = new QTableWidgetItem(ui.leY->text()); ui.tbDatos->setItem(ui.tbDatos->rowCount()-1,1,item);

14

Jhon James Quintero Osorio

void Ppal::delRow() { //Escribeme! } void Ppal::calc() { double* x=0; double* y=0; int n; n=ui.tbDatos->rowCount(); x= new double[n]; y= new double[n]; double a0,a1,cov00,cov01,cov11,sumsq; for(int i=0;i<n;i++) { x[i]=ui.tbDatos->item(i,0)->text().toDouble(); y[i]=ui.tbDatos->item(i,1)->text().toDouble(); }

std::cout<<"Datos:\n"; for(int i=0;i<n;i++) { std::cout<<x[i]<<" "<<y[i]<<"\n"; } if(gsl_fit_linear(x,1,y,1,n,&a0,&a1,&cov00,&cov01,&cov11,&sumsq)!=0) { ui.btnCalcular->setText("Error!"); }

std::cout<<"a0 :"<<a0<<" a1: "<<a1<<"\n"; QString qsa0 = QString("%1").arg(a0); QString qsa1 = QString("%1").arg(a1); ui.leA0->setText(qsa0); ui.leA1->setText(qsa1);

delete[] x; delete[] y; }

15

You might also like