Documentos de Académico
Documentos de Profesional
Documentos de Cultura
KDevelop QT PDF
KDevelop QT PDF
Tabla de Contenidos
Desarrollo Rápido de Aplicaciones usando Qt/KDE y KDevelop.................................1
1 Introducción al desarrollo rápido de aplicaciones................................................3
1.1 Que es Qt?.......................................................................................................3
1.2 Que es KDE?...................................................................................................3
1.3 Que es KDevelop?...........................................................................................3
1.4 Que es Designer?............................................................................................4
2 Inicios en programación Qt/KDE (o primeros pasos en KDevelop).......................4
2.1 Creando el proyecto........................................................................................4
2.2 Compilando la aplicación................................................................................5
2.3 Anatomía del Ejemplo1...................................................................................5
2.4 main.cpp.........................................................................................................6
2.5 La ventana principal.......................................................................................7
2.6 Conectando.....................................................................................................9
2.7 Acciones, un objeto, muchas representaciones............................................12
2.8 Nuestro widget Ejemplo1View.....................................................................15
3 Diseñando GUIs con Designer.............................................................................16
3.1 Creando un widget........................................................................................16
3.2 Poniendo widgets en nuestro widget............................................................17
3.3 Layouts, dinamismo a nuestra ventana.........................................................18
3.4 Widgets contenedores...................................................................................19
3.5 Layouts avanzados........................................................................................19
3.6 Funciones, slots y signals en Designer.........................................................21
3.7 Conexiones en Designer................................................................................22
3.8 Integrando Designer en KDevelop................................................................22
4 Conclusión...........................................................................................................23
2.4 main.cpp
Este archivo contiene la función main() de nuestro programa y algunas definiciones
de constantes, como la versión de nuestra aplicación, la descripción (para lo cual se
usa la macro de traducción I18N_NOOP) y los parámetros que puede recibir como
comando.
Lo primero que hace la función main es crear un objeto KAboutData que es el
encargado de almacenar información sobre nuestro programa que puede ser vista
yendo al menú Help->About Ejemplo1 (Ayuda->Sobre Ejemplo1).
Luego de agregar los autores al objeto KAboutData y de inicializar los parámetros de
la linea de comando viene una de las lineas más importantes:
KApplication app;
Esta linea crea el objeto app de la clase KApplication que es la clase madre de
nuestra aplicación. KApplication nos provee el control del bucle de eventos, la
función que se ejecuta mientras el usuario no esta haciendo nada y de otros recursos
como 'aceleradores', items de menú más comunes, un objeto KConfig (para la
configuración de nuestra aplicación), manejo de sesión, etc.
/**
* Default Destructor
*/
virtual ~Ejemplo1();
Los comentarios comenzando con /** (un asterisco más de lo necesario) son
comentarios de documentación. Estos comentarios pueden ser compilados por
programas como Doxygen (el más utilizado al realizar programación C/C++) y
generar la documentación del API como lo podemos ver aca:
http://developer.kde.org/documentation/library/cvs-api/kdeui/html/index.html. Es
recomendable, inclusive en las funciones privadas de las clases, utilizar
documentación de este tipo, ya que la compilación de la documentación puede
2.6 Conectando
Si lo pensamos desde un punto estricto de la programación orientada a objetos, los
widgets no son más que montones de objetos separados, entonces ¿Cómo se hace
para que un botón al ser presionado ejecute una función? o ¿Un item de menú cambie el
estado de otro item de menú?
Para resolver estos problemas, la biblioteca Qt nos provee con un sistema de signals
y slots (señales y ranuras) por las cuales un objeto puede tener una serie de signals
y una serie de slots y podemos interconectar cualquier signal con cualquier slot.
Como vimos anteriormente, un slot no es más que una función, que como cualquier
otra función puede ser privada, publica o protegida y hasta puede ser llamada
directamente, pero además, podemos conectar una señal para que la llame.
Las señales son emitidas cuando algo ocurre, por ejemplo un botón es presionado y
entonces emite la señal clicked() (presionado), si
nosotros conectamos (con la función connect()) esa
señal a nuestro slot llamado funcion1(), cada vez
que se presione el botón, nuestra función va a ser
ejecutada. Este sistema funciona gracias a moc.
Tanto el funcionamiento de moc, como la forma de
ejecutarlo escapan a este documento, KDevelop nos
provee todo lo necesario para no preocuparnos por
eso, solo debemos recordar, que cada objeto que
vaya a utilizar el sistema de signals/slots tiene que,
en su declaración, incluir la directiva Q_OBJECT y
en su implementación, incluir el archivo del mismo
nombre que si mismo, pero terminando en .moc,
para ejemplo1.cpp, el archivo a incluir es
ejemplo1.moc mediante: #include "ejemplo1.moc".
Figura 4: Cuatro objetos con
Viendo un ejemplo más complejo, la figura 4 nos varios slots y signals
muestra cuatro objetos Object1, Object2, Object3 y interconectados.
Object4 que vamos a suponer que son instancias de las clases Object1Class,
Object2Class, Object3Class y Object4Class respectivamente. El objeto Object1 tiene
su signal signal1 conectada al slot slot1 y a slot2 del objeto Object2 (una signal
puede estar conectada a más de un slot, así como más de una signal pueden estar
conectadas a un mismo slot) y el Object3 tiene su signal1 conectada al slot3 del
Object4, traduciéndolo en código, veríamos las declaraciones (simplificadas) como:
class Object1Class{
signals:
void signal1();
void signal2(int);
};
class Object2Class{
public slots:
void slot1();
void slot2();
signals:
void signal1();
};
class Object3Class{
public slots:
void slot1(char);
signals:
void signal1(double);
};
class Object4Class{
public slots:
void slot1(int);
void slot2();
void slot3(double);
};
y sus definiciones suponiendo que queramos que el slot slot1 de Object3 emita la
signal1:
void Object2Class::slot1(){
hacerAlgo();
}
void Object2Class::slot2(){
hacerAlgo();
}
void Object3Class::slot1(double x){
hacerAlgo(x);
emit signal1(43.5)
}
void Object4Class::slot1(int a){
hacerAlgo(a);
}
void Object4Class::slot2(){
hacerAlgo();
}
void Object4Class::slot3(double f){
hacerAlgo(f);
}
emit es una macro provista por Qt que debemos anteponer a las signals cuando las
queremos emitir.
Las definiciones de las signals no son necesarias, de hecho no deben estar ya que
son generadas por moc (en el archivo de extensión .moc, se verá más adelante).
Para generar las conexiones necesarias como indica la figura 4 deberíamos utilizar
el siguiente código:
connect(Object1, SIGNAL(signal1()), Object2, SLOT(slot1()));
connect(Object1, SIGNAL(signal1()), Object2, SLOT(slot2()));
connect(Object1, SIGNAL(signal2(int)), Object4, SLOT(slot1(int)));
connect(Object3, SIGNAL(signal1(double)), Object4, SLOT(slot3(double)));
SIGNAL y SLOT son macros que provee Qt que sirven para identificar signals y slots.
A tener en cuenta, es que para poder conectar una signal a un slot, estos deben
tener los mismos parámetros, seria imposible conectar Object1::signal1 a
Object4::slot1.
son las que se usan para abrir una URL (o saber que URL esta abierta), estas son,
las funciones que llamaría la función Ejemplo1::fileOpen();
Ejemplo1View también hereda Ejemplo1Iface que tiene que ver con exportar
funciones con DCOP. Iface viene de la palabra en ingles interface (interfase en
español).
Este widget interno, no nos es realmente muy útil y lo más probable es que lo
reemplacemos casi en su totalidad. Podríamos simplemente, agregarle código para
que cree los botones, las listas des plegables, las etiquetas, etc que queramos, pero
eso es una tarea ardua y aca buscamos el camino más fácil y más corto, por eso,
vamos a usar Designer para esta tarea.
A la izquierda vemos una caja de herramientas que tiene solapas, allí es donde
tenemos todos los posibles widgets que podemos poner en nuestro widget. Están
ordenados por categorías como Buttons (Botones), Containers (Contenedores), Views
(Vistas), etc. Los que dicen KDE en su descripción, son los widgets que provee KDE
el resto, suelen ser los que provee Qt. Arriba tenemos una barra de herramientas
con algunas funciones útiles y a la derecha tenemos (de arriba hacia abajo) la lista
de archivos abiertos (ordenada de acuerdo a los proyectos abiertos, en este caso,
ningún proyecto, solo un widget), la lista de objetos presentes en el widget
seleccionado, solo Form1 en este caso y por ultimo, la lista de propiedades del
objeto seleccionado que nos ofrece una gran variedad de cosas para cambiar, desde
el titulo, hasta el valor predeterminado, rango de valores, modo de funcionamiento,
margenes, separaciones, etc dependiendo de que tipo de widget sea.
4 Conclusión
El desarrollo rápido de aplicaciones utilizando herramientas libres en el entorno
Linux (u otro sistema libre como OpenBSD o FreeBSD) puede parecer intimidante ya
que no todo depende de una sola herramienta sino de una serie de herramientas que
hay que poner a trabajar en conjunto. No obstante es posible y es posible obtener
muy buenos resultados.
Índice de figuras
Figura 1: Creando un nuevo proyecto llamado Ejemplo1 con KDevelop.....................4
Figura 2: Ventana de compilación al empezar a compilar Ejemplo1...........................5
Figura 3: esta es nuestra aplicación, llamada Ejemplo1 ejecutándose por primera
vez................................................................................................................................5
Figura 4: Cuatro objetos con varios slots y signals interconectados..........................10
Figura 5: Menú Archivo o File....................................................................................12
Figura 6: Menú Preferencias o Settings.....................................................................12
Figura 7: Menú Ayuda o Help....................................................................................12
Figura 8: Barra de herramientas o Toolbar...............................................................13
Figura 9: Dialogo para configurar las barras de herramientas de Ejemplo1.............15
Figura 10: Designer con un nuevo widget recién creado...........................................16
Figura 11: Widget con muchos otros widgets adentro...............................................17
Figura 12: Nuestro widget es demasiado chico.........................................................17
Figura 13: nuestro widget es demasiado grande.......................................................18
Figura 14: Botones ordenados verticalmente.............................................................18
Figura 15: Botones ordenados horizontalmente........................................................18
Figura 16: Botones ordenados en una grilla..............................................................18
Figura 19: Grilla de tres de alto por dos de ancho donde el botón 3 y 4 ocupan dos
casilleros de ancho.....................................................................................................19
Figura 20: Grilla de 3 de alto por 2 de ancho donde el botón 4 ocupa 3 casilleros de
alto (nota: ciertas propiedades del botón 4 fueron cambiadas para que ocupe todo el
espacio disponible verticalmente)..............................................................................19
Figura 18: Grilla de 4 de alto por 2 de ancho con 4 casilleros vacíos y 4 con botones..
19
Figura 17: Botones en una grilla de dos por dos........................................................19
Figura 21: Widgets contenedores provistos por Qt....................................................19
Figura 22: Todos los widgets en la ventana pero ningún layout................................20
Figura 23: Creado el layout de grilla.........................................................................20
Figura 24: Creado el layout horizontal.......................................................................21
Figura 25: Layout general creado..............................................................................21
Figura 26: Nuestra ventana, como se vería al ejecutar el programa, en su tamaño
más chico posible.......................................................................................................21
Figura 27: Nuestra ventana, como se vería al ejecutar el programa maximizado.....21
Figura 28: Haciendo una declaración de una función virtual publica.......................22
Figura 29: Creando una conexión..............................................................................22
Figura 30: Creando una subclase de ABMWidget, llamada ABM..............................23
La figura 4 (en la página 10) tiene copyright (derechos de autor) de TrollTech y
puede ser encontrada en su formato original en
http://www.trolltech.com/products/qt/whitepaper/abstract-connections.png. La
imagen fue modificada para este documento.