p1

Siguiente Anterior Tabla de Contenidos

El ejemplo que mostramos con p1 es una de las aplicaciones Qt mas simples, todo el código está en el fichero main.cpp:


#include <qapplication.h>
#include <qpushbutton.h>

int main( int argc, char **argv )
{
    QApplication a( argc, argv );

    QPushButton *hello=new QPushButton( "Hello world!", 0 );
    hello->resize( 100, 30 );
 
    QObject::connect( hello, SIGNAL(clicked()), &a, SLOT(quit()) );
 
    a.setMainWidget( hello );
    hello->show();
 
    return a.exec();
} 

main.cpp

Veamos que hace cada una de las lineas.

    QApplication a( argc, argv );

Este código crea un objeto QApplication que controlará el flujo de ejecución de la aplicación, así como la mayoría de las opciones del sistema y la aplicación (para conseguir un entorno mas uniforme), etc.

    QPushButton *hello=new QPushButton( "Hello world!", 0 );
    hello->resize( 100, 30 );

Con este código creamos un objeto QPushButton. Este es un botón pulsable, en contraposición con botones que tienen estados (como QRadioButton, donde hay varios botones de los que sólo uno puede estar pulsado en un momento dado, o QCheckBox, que es un botón que puede estar marcado(pulsado) o no).

El botón contienen el texto "Hello world!, y no tiene ventana padre (0 se pasa como un puntero NULL ). Usando un widget sin padre hacemos que el gestor de ventanas maneje este widget como otra ventana del escritorio. Usualmente las aplicaciones tienen una sola ventana sin padre, que es el "main widget" o widget principal, veremos más sobre esto posteriormente.

Además redimensionamos el widget para que tenga 100 pixeles de largo y 30 de altura.

    QObject::connect( hello, SIGNAL(clicked()), &a, SLOT(quit()) );

Para explicar este código deberiamos de tener un poco de conocimiento sobre el mecanismo de señales y slots (signals/slots). Intentaré explicarlo un poco aquí, aunque si queda alguna duda se puede leer el magnífico capítulo que sobre este tema trae la documentacion de Qt, llamado "Introduction to Signals and Slots".

Todas las clases que heredan de QObject ( directa o indirectamente heredando de una subclase de QObject ) pueden contener señales y/o slots. Un objeto emite una señal siempre que cambia su estado de alguna forma. Por ejemplo, cuando se pulsa sobre un QPushButton se emite una señal clicked(), o cuando se hace scroll con una QScrollBar se emite una señal valueChanged(). Por otro lado, un slot es un método normal en un objeto que tiene la capacidad de que puede recibir señales.

Un objeto no tiene por qué saber si un slot está conectado a múltiples señales, e incluso se puede conectar una señal a múltiples slots o múltiples señales a un solo slot. Cualquier combinación es válida. Esto permite crear componentes verdaderamente reusables en el desarrollo de una aplicación.

El código que se necesita para llamar a los slots es generado por moc (meta object compiler) junto a otro código que inicializa la información de los metaobjetos. Veremos posteriormente como usar moc, pero como por ahora nos centramos en el ejemplo 1, y no hace falta, no usaremos moc todavia.

Finalmente, el código de arriba se usa para conectar la señal de "clicked()" del objeto hello al slot "quit()" de la aplicación (a) que cuando se ejecuta, cierra la aplicación.

    a.setMainWidget( hello );
    hello->show();

Este código hace que hello sea el widget principal (main) de la aplicación (el que cerrará la aplicación cuando sea destruido), y lo muestra en la pantalla.

    return a.exec();

Finalmente, el bucle de eventos es ejecutado y dejamos que el usuario tome el control de la aplicación. Siempre que el usuario pulse en el botón de "hello", el bucle de eventos llamará al slot quit() de la aplicación y esta función devolverá el código de retorno con el que salimos de la aplicación.

¿ No es fácil ? :-)

Siguiente Anterior Tabla de Contenidos


© 1999-2002 Antonio Larrosa
Traducido por Rafael Larrosa