Tutorial Gtk+2: Widgets, Signals y Callbacks (o “como funcionan las cosas”)
En esta sección del tutorial revisaremos la forma en la que puede interactuar el usuario con Gtk+ esto se logra principalmente con 3 herramientas en la mayoría de las interfaces gráficas:
1.-Widgets (dispositivo, artilugio), esto es toda herramienta con la que pueda interactuar el usario de forma directa o indirecta, ejemplos de widgets son: botones, campos de texto, listas, tablas etc.
2.-Signals (señales), toda muestra de que el usario ha utlilicado un widget utilizando algún dispositivo de entrada como es el teclado o el mouse, ejemplos de señales son: clicks, apretar alguna tecla, mover el puntero del ratón sobre algún área concreta etc.
3.-Callbacks (call back=”devolver llamada”), son las funciones que unen las señales y los widgets bajo un mismo contexto y realizan alguna acción en concreto, al dar “click” sobre el “boton abrir” se ejecuta una callback que abre el diálogo de selección de archivo, reciben el nombre de callbacks, ya que el sistema se encuentra en continuo monitoreo de las señales que podrían manifestarse mientras la ventana esta activa, y cuando detectan alguna las callbacks “devuelven la llamada” al sistema ejecutando la orden deseada.
Sin más preámbulos el código de esta sección:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include #include <gtk/gtk.h> struct context{ int i; GtkWidget* label; }context; static void aumenta( GtkWidget *widget,struct context* cntxt ) { cntxt->i++; const char* text=g_strdup_printf("#:%d",cntxt->i); gtk_label_set_text((GtkLabel*)cntxt->label,text); } static void destroy( GtkWidget *widget, gpointer data ) { gtk_main_quit (); } int main( int argc, char *argv[] ) { GtkWidget *window; GtkWidget *button; GtkWidget *box; struct context cntxt; cntxt.i=0; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL); gtk_container_set_border_width (GTK_CONTAINER (window), 10); button = gtk_button_new_with_label ("¡Presioname!"); cntxt.label= gtk_label_new("#:0"); box=gtk_hbox_new(FALSE,0); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (aumenta), &cntxt); gtk_container_add (GTK_CONTAINER (window), box); gtk_box_pack_start(GTK_BOX(box),button,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(box),cntxt.label,TRUE,TRUE,0); gtk_widget_show (button); gtk_widget_show(box); gtk_widget_show (cntxt.label); gtk_widget_show (window); gtk_main (); return 0; } |
Linea por linea:
1 2 3 4 5 6 | #include <gtk/gtk.h> struct context{ int i; GtkWidget* label; }context; |
Analizemos el código, al comenzar incluimos nuestras librerias de gtk, despues viene una pequeña estructura que son los elementos a modificar mediante la callback.
8 9 10 11 12 13 | static void aumenta( GtkWidget *widget,struct context* cntxt ) { cntxt->i++; const char* text=g_strdup_printf("#:%d",cntxt->i); gtk_label_set_text((GtkLabel*)cntxt->label,text); } |
Nuestra callback principal todas las callback tienen la siguiente estructura soyunacallback(GtkWidget* widget,gpointer data) donde el primer parametro es el widget que recibio la señal y el segundo es un puntero con los datos que queremos utilizar dentro de la callback, en este caso nuestra estructura.
8 9 10 11 | static void destroy( GtkWidget *widget, gpointer data ) { gtk_main_quit (); } |
Otra callback, esta realiza la tarea de terminar nuestro proceso en forma (al contrario de la sección anterior donde habia que hacerlo desde consola) y se ejecuta cuando la ventana recibe la señal “destroy” y que se pueda dar de distintas formas, como hacer click en la X de la esquina superior derecha (por si no la encuentran), o apretar la combinación de teclas alt-f4.
20 21 22 23 24 25 26 27 28 29 30 | int main( int argc, char *argv[] ) { GtkWidget *window; GtkWidget *button; GtkWidget *box; struct context cntxt; cntxt.i=0; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); |
Inicio de nuestra funcion main, declaración de cuatro widgets y nuestra estructura e inicialización de la variable i y de window.
32 33 34 35 | g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL); gtk_container_set_border_width (GTK_CONTAINER (window), 10); |
Conexión de el Widget ventana, con la señal “destroy” y la callback homónima, el ultimo parametro como se verá mas adelante es el mismo “gpointer data” de la callback, la siguiente linea define el grosor del borde de la ventana.
37 38 39 | button = gtk_button_new_with_label ("¡Presioname!"); cntxt.label= gtk_label_new("#:0"); box=gtk_hbox_new(FALSE,0); |
Inicialización de los widgets “button” y “label”, el ultimo de nuestra estructura, en la ultima linea se inicializa el Widget del tipo hbox, que nos permitira acomodar varios widgets dentro de nuestra ventana, tema que se explicará más ampliamente en la siguiente sección.
41 42 | g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (aumenta), &cntxt); |
Conexión del widget button con la señal “clicked” y la callback aumenta, aqui podemos ver como el úlitmo parametro es un apuntador a nuestra estructura.
44 45 46 | gtk_container_add (GTK_CONTAINER (window), box); gtk_box_pack_start(GTK_BOX(box),button,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(box),cntxt.label,TRUE,TRUE,0); |
Aqui agregamos el widget del tipo caja al contenedor ventana, y en lugar de utilizar la función gtk_container_add, se utiliza la funcion gtk_box_pack_start, se especificarán los parámetros de esta función en la siguiente sección dedicada a contenedores.
48 49 50 51 52 53 54 55 56 | gtk_widget_show (button); gtk_widget_show(box); gtk_widget_show (cntxt.label); gtk_widget_show (window); gtk_main (); return 0; } |
Se muestran todos nuestros widgets y se da comienzo a la función principal, la cual permite el “escuchar” si alguna señal ha sido emitida y ejecuta la callback adecuada según el caso.
Artículos relacionados
- Tutorial Gtk+2: Hola Mundo
- Tutorial Gtk+ 2: Instalacion de Gtk+ 2 en Linux
- Tutorial de Qt 4: Introducción a Qt
- Zona Qt: Nuevo sitio web dedicado a Qt
- Tutorial de Qt 4: Nuestro primer programa, "Hola Mundo"





Muro de Comentarios RSS Feed