ProgramacionGTKenC/CapituloVIII
Conceptos avanzados en GTK+
Hemos quedado con un monton de dudas hasta el momento acerca de algunos de los ejemplos presentados anteriormente.
Cubramos cada uno de ellos aqui, de menor a mayor complejidad.
Señales
Habiamos visto que cada uno de los widgets recibe (y emite) señales. Estas son tomadas por el subsistema de GTK+ y ejecuta las funciones pertinentes, permitiendo que los programas dejen de ser aburridos y ejecuten mas acciones, con o sin la ayuda del usuario.
Una señal que se ha visto seguido es la asociada al widget boton:
g_signal_connect ((GObject *) boton_n,"clicked", (GCallback * ) funcion_n, NULL);
esto es que la funcion "funcion_n" es ejecutada al momento de hacer clic en el boton "boton_n".
Antiguamente (y en varios ejemplos antiguos) se ve que la funcion se llamaba gtk_signal_connect(). Esta es una funcion que se depreco desde la version 2.x de GTK+.
No crean que es la unica señal que es capaz de recibir el boton. Para eso, hay que entender un poco la jerarquia de objetos de GTK+.
Objetos
Habia dicho de un principio que todos los widgets son herencia de GObject, y a GtkWidget, y esta es una de las razones que la declaracion de los widgets en codigo pueda ser:
GtkWidget * widget1; GtkWidget * widget2; ...
Ser "hijos" de GObject les permite, por ejemplo, la emision y recepcion de señales (de ahi la funcion g_object_signal).
Los GObjects es el tipo fundamental para los atributos y objetos en GTK+. Esto permite tener una serie de fundaciones (funciones base) para la construccion de objetos, acceso a metodos y soporte de señales.
Un GObject posee solo cuatro funciones basicas:
- get_property()
- set_property()
- dispose()
- finalize()
Solo nos centraremos en las primeras dos.
Habiamos visto hace algunas entregas atras que podemos cambiar algunas propiedades de los widgets.
Un ejemplo simple:
gtk_window_set_title((GtkWindow *) ventana, "titulo de la ventana");
Esto solo cambia el titulo de la ventana a "titulo de la ventana".
Revisando un poco la documentacion de GTK+, se puede ver que el widget de ventana posee la propiedad "title" (titulo). Esta la podemos cambiar con la funcion anterior (gtk_window_set_title). Pero como un widget es un GObject, podemos cambiar la propiedad "title" usando una funcion de GObject:
g_object_set_property((Gobject *) ventana, "title", "titulo de la ventana");
Ademas, las funciones de GObject nos permiten cambiar multiples propiedades de un widget!
g_object_set((GObject *) ventana, "title", "titulo de la ventana", "default-height", 100, "default-width", 200, "accept-focus", TRUE, "destroy-with-parent", TRUE, NULL);
La unica señal que puede recibir un GObject es "notify", que es usada para emitir advertencias acerca de propiedades no esperadas o no soportadas por el objeto. Por ejemplo, si queremos preguntar por "title" en un widget de boton.