En GTK+, los tipos de widgets con conocidos como clases. Dichas clases definen la funcionalidad y los atributos de un widget. Por ejemplo, en GTK+ existen muchos tipos de botones, definidos por las widgets clases: GtkButton, GtkToggleButton, GtkCheckButton, GtkRadioButton y GtkSpinButton.
La clase GtkObject es la clase más alta en el árbol de GTK+. GtkObject define atributos y métodos disponibles en todas las clases en GTK+. No tiene el fin de ser un componente que tiene que existir en todas las aplicaciones, más bien es una clase base. Los dos hijos de la clase GtkObject son, GtkData y GtkWidget son también clases base. Dichas clases son clases que no representan componentes en una interface de usuario, únicamente son clases que definen funcionalidad, métodos y atributos que van a ser heredados por sus hijos.
GtkData es una clase base para los objetos cuyo fin es pasar información a nuestra aplicación, es decir, a nuestra interface de usuario. Por ejemplo, la clase GtkAdjustment representa el movimiento de barras de desplazamiento, escalas y otros widgets que permiten al programador poner todos los objetos de la interface de usuario juntos. La clase GtkAdjustment provee de todos los métodos que se necesitan para realizar dichas acciones.
Otro objeto de la clase GtkData es GtkTooltips, el cual nos provee de todos los métodos para desplegar mensajes cortos (tips) cuando el usuario se posiciona sobre algún widget en particular.
La última clase que se muestra en el árbol de clases de GTK+ es la clase GtkWidget. Ésta es la clase base para los widgets que hacen la interface de usuario. La clase GtkWidget tiene once hijos y es el padre de los más de 60 widgets previamente mencionados.
La siguiente figura muestra las 11 clases hijo de la clase GtkWidget:
GtkCalendar crea un calendario mensual, y provee la capacidad de que el usuario recorra los diferentes meses.
GtkContainer es la clase base de los widgets que pueden estar a cargo de otros widgets en la interface de usuario.
Por ejemplo, uno de los hijos de esta clase es una caja (box) que maneja y cambia el tamaño de todos los widgets que están dentro de ella. La clase GtkContainer tiene
12 hijos y un total de 48 clases que descienden de ella.
GtkDrawingArea crea un área específica para comandos de dibujo de GDK. GtkDrawingArea tiene sólo una clase
hijo, GtkCurve.
GtkEditable es la clase base para los widgets que soportan entradas de texto que puede ser modificado por el usuario. Tiene 3 clases descendientes.
GtkInvisible crea un widget invisible creado para las operaciones de drag-and-drop, y normalmente no es implementado por nuestra aplicación.
GtkMisc es la clase base para los widgets que permiten rellenar y agregar nuevas características a nuestra interface, como etiquetas o mensajes. Tiene 5 clases descendientes.
GtkPreview es la clase usada para desplegar imágenes en escala de grises o color.
GtkProgressBar es un widget usado para mostrar información del progreso, como un porcentaje de un archivo que ha sido transferido, y no tiene descendientes.
GtkRange es la clase base para los widgets que muestran un rango ajustable, como una escala o una barra de desplazamiento. Posee seis clases descendientes.
GtkRuler es la clase base para los widgets de reglas horizontal y vertical utilizados para mostrar medidas en los bordes de alguna área. Tiene dos clases descendientes.
GtkSeparator es la clase base para los widgets horizontal y vertical utilizados principalmente en los menús para separar grupos de objetos relacionados entre sí. Tiene dos clases descendientes.
GTK+ posee una característica, llamada temas (themes), lo cual es una manera fácil de cambiar la apariencia de los programas desarrollados en GTK+. Básicamente, un tema define los colores y patrones de los widgets durante sus diferentes estados (como normal, activado, desactivado, etc).
Para compilar un programa en GTK+ se tiene que teclear lo siguiente:
Cada aplicación de GTK+ crea un widget como parte de la interface gráfica de usuario. En el mundo de la programación orientada a objetos, lo anterior es llamado instanciar, o crear la instancia de una clase. Una clase define las capacidades, características y apariencia de un widget. Por ejemplo, la clase GtkButton describe a un objeto (un botón) que el usuario selecciona para realizar alguna acción, como salir de alguna aplicación. Para poder hacer que un botón aparezca en nuestra aplicación, debemos crear una instancia de la clase GtkButton.
Cada aplicación desarrollada en GTK puede ser representada por un árbol, el cual describe todos los widgets que fueron instanciados y que forman parte de la interface gráfica de usuario. Se establece una relación padre/hijo entre los widgets instanciados para definir el árbol. El widget padre va a controlar el comportamiento de los hijos en cierto grado. El grado de control va a depender del tipo de la clase del widget padre. Algunos widgets padre (como GtkBox o GtkTable) pueden controlar muchos aspectos del comportamiento de sus hijos, como su tamaño, posición y lo que hacen cuando cambia de tamaño el contenedor. Otros padres tienen un control menor sobre sus hijos, más allá de su visibilidad en la pantalla.
El árbol de instancias de los widgets contiene información jerárquica en relación con los widgets que forman parte de la interface de usuario. Dicho árbol normalmente contiene información del tipo y de los ancestros de los widgets.
Supongamos que creamos un programa con la siguiente interface de usuario, cuyo nombre es gtktest:
Como se puede ver, gtktest utiliza cinco widgets para crear la interface gráfica. Tradicionalmente, el widget que está en la posición más alta del árbol tiene el mismo nombre que el programa ejecutable. El texto "GTK+ is fun" es almacenado en un label widget. El botón de salida es también un widget. Inclusive la línea entre el texto y el botón es un widget. Los tres widgets anteriores son almacenados dentro de una caja vertical (vertical box widget), la cual está contenida dentro del widget gtktest.
Un widget no puede ser visto (desplegado a la pantalla) a menos que él y cualquiera de sus widgets ancestros directos sean declarados como vistos. En el caso de nuestro ejemplo, significa que la etiqueta "GTK+ is fun" no puede ser vista hasta que ambos, gtktest y el vertical box sean mostrados. De esta manera, si nosotros fijamos la visibilidad de gtktest como true, la aplicación completa se mostrará; de manera contraria, si fijamos la visibilidad como false, toda la aplicación "desaparecerá". Esto previene que los widgets hijos estén flotando en la pantalla sin su padre (en una calculadora, los botones no aparecen sin que antes haya aparecido la calculadora en sí).
A continuación entremos más a detalle en el árbol de instancias que compone nuestro programa de prueba.
El diagrama anterior es el mismo árbol que se vió anteriormente, pero con la adición de las clases widget de cada widget instanciado. El widget gtktest es un miembro de la clase GtkWindow. Un widget del tipo GtkWindow es usualmente el primer widget que se instancía en una aplicación y es normalmente conocido como top-level widget. La siguiente figura muestra la rama de GtkWindow del árbol de clases de GTK+:
La función primaria de un widget del tipo GtkWindow es proveer una comunicación entre la aplicación y el administrador de ventanas. Cuando el usuario cambia el tamaño de la ventana principal con el window manager, dicha información es pasada a GtkWindow.
Como se puede ver en la figura anterior, GtkWindow es descendiente de la clase GtkBin. La clase GtkBin restringe el número de hijos de los widgets de este tipo a uno solo. Así, cualquier clase descendiente heredará esta restricción. Por lo tanto, un widget del tipo GtkWindow sólo podrá tener un hijo.
El vertical box widget es descendiente de la clase GtkBox. La rama del árbol de GTK+ al cual pertenece, se muestra a continuación:
La clase GtkBox también es una clase base que define tamaño y atributos de espacio para las clases de cajas horizontales y verticales GtkVbox y GtkHBox. En los programa se necesitará instanciar ya sea un GtkVBox o un GtkHBox, dependiendo de la dirección en que se quieran extender a los widgets hijos.
El label widget pertenece a la clase GtkLabel. Una etiqueta es una clase simple. Ninguna acción está asociada a las etiquetas. Se puede especificar sólamente si el texto se va a desplegar centrado, alineado a la derecha o a la izquierda, además del tamaño y tipo de la letra.
Un separator widget es parte de la clase GtkSeparator. La clase GtkSeparator es también una clase base de las clases de separador horizontal y vertical GtkHSeparator y GtkVSeparator.
El widget exit es parte de la clase GtkButton. La clase GtkButton provee un widget que es capaz de realizar alguna acción definida por el usuario al hacer click en el. Cabe aclarar que GtkButton es descendiente de GtkBin, eso implica que sólo puede manejar un hijo, el cual es una etiqueta (label), es decir, la etiqueta del botón.