Página siguiente Página anterior Índice general

5. Estudio general de los widgets

Los pasos generales a la hora de crear un widget son:

  1. Usar gtk_*_new - Una de las diferentes formas de crear un widget. (Todas serán explicadas en esta sección).
  2. Connectar todas las señales y los eventos a los controladores apropiados.
  3. Establecer los atributos del widget.
  4. Empaquetar el widget en un contenedor usando las llamadas apropiadas, como gtk_container_add() o gtk_box_pack_start().
  5. Mostrar el widget usando gtk_widget_show().

Mediante esta última llamada GTK `sabe' que hemos acabado de establecer los atributos del widget, y que por lo tanto puede ser mostrado. Se puede usar gtk_widget_hide para hacer que desaparezca. El orden en el que se muestran los widgets no es importante, pero se recomienda mostrar lo último la ventana para que todo aparezca de golpe. El hijo de un widget no se muestra hasta que la propia ventana (que en este caso es un widget padre) es mostrada mediante gtk_widget_show().

5.1 Conversión de tipos

GTK usa un sistema de conversión de tipos mediante macros que comprueban si se puede realizar la conversión y en caso afirmativo la hacen. Las más comunes son:

Todas son usados para cambiar de tipo los argumentos de una función. Aparecerán mucho en los ejemplos, para usarlas sólo hay que mirar la declaración de la función.

Tal y como se puede ver en el árbol de clases (situado un poco más adelante) todos los widgets derivan de la clase base GtkObject. Esto significa que siempre se puede usar un widget como argumento de una función (que acepte un objeto, claro) realizando la conversión de tipo GTK_OBJECT().

Por ejemplo:

gtk_signal_connect( GTK_OBJECT(button), "clicked",
                    GTK_SIGNAL_FUNC(callback_function), callback_data);

Hemos hecho que el botón pase a ser un objeto y que se cambie el puntero a la función a una función respuesta.

Muchos widgets son contenedores, por lo que unos pueden derivar de otros (la mayoría lo hace de GtkContainer). Cualquiera puede ser usado junto con la macro GTK_CONTAINER como argumento a funciones en forma de puntero.

Desgraciadamente estas macros no son descritas en detalle en el tutorial, por lo que se recomienda echar un vistazo a los archivos de cabecera de GTK. En la práctica es posible aprender a manejar un widget leyendo las declaraciones de las funciones.

5.2 Árbol formado por los widgets

A continuación se detallan todas las ramas del árbol que forman los widgets.

  GtkObject
   +GtkData
   | +GtkAdjustment
   | `GtkTooltips
   `GtkWidget
     +GtkContainer
     | +GtkBin
     | | +GtkAlignment
     | | +GtkEventBox
     | | +GtkFrame
     | | | `GtkAspectFrame
     | | +GtkHandleBox
     | | +GtkItem
     | | | +GtkListItem
     | | | +GtkMenuItem
     | | | | `GtkCheckMenuItem
     | | | |   `GtkRadioMenuItem
     | | | `GtkTreeItem
     | | +GtkViewport
     | | `GtkWindow
     | |   +GtkColorSelectionDialog
     | |   +GtkDialog
     | |   | `GtkInputDialog
     | |   `GtkFileSelection
     | +GtkBox
     | | +GtkButtonBox
     | | | +GtkHButtonBox
     | | | `GtkVButtonBox
     | | +GtkHBox
     | | | +GtkCombo
     | | | `GtkStatusbar
     | | `GtkVBox
     | |   +GtkColorSelection
     | |   `GtkGammaCurve
     | +GtkButton
     | | +GtkOptionMenu
     | | `GtkToggleButton
     | |   `GtkCheckButton
     | |     `GtkRadioButton
     | +GtkCList
     |  `GtkCTree
     | +GtkFixed
     | +GtkList
     | +GtkMenuShell
     | | +GtkMenuBar
     | | `GtkMenu
     | +GtkNotebook
     | +GtkPaned
     | | +GtkHPaned
     | | `GtkVPaned
     | +GtkScrolledWindow
     | +GtkTable
     | +GtkToolbar
     | `GtkTree
     +GtkDrawingArea
     | `GtkCurve
     +GtkEditable
     | +GtkEntry
     | | `GtkSpinButton
     | `GtkText
     +GtkMisc
     | +GtkArrow
     | +GtkImage
     | +GtkLabel
     | | `GtkTipsQuery
     | `GtkPixmap
     +GtkPreview
     +GtkProgressBar
     +GtkRange
     | +GtkScale
     | | +GtkHScale
     | | `GtkVScale
     | `GtkScrollbar
     |   +GtkHScrollbar
     |   `GtkVScrollbar
     +GtkRuler
     | +GtkHRuler
     | `GtkVRuler
     `GtkSeparator
       +GtkHSeparator
       `GtkVSeparator

5.3 Widgets sin ventanas

Los siguientes widgets no tienen ventanas asociadas. Si se quieren capturar eventos se tendrá que utilizar GtkEventBox. En la sección El Widget EventBox se pueden encontrar más detalles sobre su uso.

GtkAlignment
GtkArrow
GtkBin
GtkBox
GtkImage
GtkItem
GtkLabel
GtkPixmap
GtkScrolledWindow
GtkSeparator
GtkTable
GtkAspectFrame
GtkFrame
GtkVBox
GtkHBox
GtkVSeparator
GtkHSeparator

Vamos a continuar la explicación describiendo cada uno de los widgets mediante ejemplos. También se puede consultar el programa testgtk.c (Se encuentra en gtk/testgtk.c).


Página siguiente Página anterior Índice general