Programación en GTK+ (Tercera Parte) - Widgets Adicionales
Tutorial creado por Juan Carlos Inostroza. Extraido de: http://www.tux.cl/articulos.php?id=34
04 de Enero de 2005
Programación estructurada
2 - Widgets Adicionales
2.1 Empaquetadores (HBox y VBox)
En el articulo pasado, estuve hablando de los contenedores de Widgets. Un widget puede contener a otro, como el caso de una ventana puede contener un botón.
Pero existen dos widgets que su tarea es "empaquetar" los widgets contenidos dentro de ellos. No son visibles y son capaces de controlar simultaneamente a varios widgets hijos contenidos dentro de ellos.
Un empaquetador horizontal (HBox) se crea con la funcion gtk_hbox_new() y uno vertical, con la funcion gtk_vbox_new().
GtkWidget * hbox, * vbox;
hbox = gtk_hbox_new(TRUE, 2);
vbox = gtk_vbox_new(FALSE, 3);
El primer parametro de gtk_hbox_new() determina si los widgets que se añadan deben tener un area reservada de pantalla del mismo tamaño. El segundo parametro es el espaciado en pixeles entre cada uno de los widgets.
Para insertar un widget dentro de un empaquetador no se usa gtk_container_new(), sino gtk_box_pack_start().
GtkWidget * hbox;
GtkWidget * boton;
hbox = gtk_hbox_new(TRUE,3);
boton = gtk_button_new_with_label("Boton");
gtk_box_pack_start(GTK_BOX(hbox), boton, TRUE, TRUE, 0);
boton = gtk_button_new_with_label("Otro Boton");
gtk_box_pack_start(GTK_BOX(hbox), boton, TRUE, TRUE, 0);
El primer parametro de gtk_box_pack_start() es el empaquetador, el segundo es el Widget a contener. El tercer parametro (expand) indica si el empaquetador puede ampliarse para ocupar cualquier espacio restante despues de haber añadido todos los widgets al empaquetador. El cuarto parametro (fill) indica si el widget insertado debe ocupar el espacio extra alrededor de éste. El ultimo parametro, padding, indica cuantos pixeles deben rodear al widget contenido.
Veamos esto con un ejemplo simple:
#include <gtk/gtk.h>
int main (int argc, char * argv[])
{
GtkWidget * hbox, * ventana;
GtkWidget * boton;
gtk_init (&rgc, &argv);
ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
hbox = gtk_hbox_new(TRUE, 3);
gtk_signal_connect(GTK_OBJECT(ventana), "delete_event",
GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
gtk_container_add(GTK_CONTAINER(ventana), hbox);
boton = gtk_button_new_with_label("Boton 1");
gtk_box_pack_start(GTK_BOX(hbox), boton, FALSE, FALSE, 0);
boton = gtk_button_new_with_label("Boton 2");
gtk_box_pack_start(GTK_BOX(hbox), boton, FALSE, FALSE, 0);
boton = gtk_button_new_with_label("Boton 3");
gtk_box_pack_start(GTK_BOX(hbox), boton, FALSE, FALSE, 0);
gtk_widget_show_all(ventana);
gtk_main();
return 0;
}
y este es el resultado:
Ahora, para evitar que el contenedor ocupe el 100% de la ventana, vamos a darle un borde. Para esto, le damos un borde a un contenedor usando la funcion gtk_container_border_width().
Ademas, agreguemos otros empaquetados horizontales y verticales para hacer mas complejo el ejemplo :-)
#include <gtk/gtk.h>
int main (int argc, char * argv[])
{
GtkWidget * hbox, * vbox, * ventana, *etiqueta;
GtkWidget * boton;
gtk_init (&argc, &argv);
ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
vbox = gtk_vbox_new(TRUE, 0);
hbox = gtk_hbox_new(TRUE, 3);
gtk_signal_connect(GTK_OBJECT(ventana), "delete_event",
GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
gtk_container_border_width(GTK_CONTAINER(ventana), 50);
gtk_container_add(GTK_CONTAINER(ventana), vbox);
boton = gtk_button_new_with_label("Boton 1");
gtk_box_pack_start(GTK_BOX(hbox), boton, FALSE, FALSE, 0);
boton = gtk_button_new_with_label("Boton 2");
gtk_box_pack_start(GTK_BOX(hbox), boton, FALSE, FALSE, 0);
boton = gtk_button_new_with_label("Boton 3");
gtk_box_pack_start(GTK_BOX(hbox), boton, FALSE, FALSE, 0);
etiqueta = gtk_label_new("Etiqueta");
gtk_box_pack_start(GTK_BOX(vbox), etiqueta, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
boton = gtk_button_new_with_label("Otro Boton");
gtk_box_pack_start(GTK_BOX(vbox), boton, TRUE, TRUE, 0);
gtk_widget_show_all(ventana);
gtk_main();
return 0;
}
Y este es el resultado
Como ejercicio, queda determinar que pasa al cambiarle el tamaño de la ventana (y como solucionarlo).
2.2 Toggles, CheckButton y RadioButton
Los ToggleButtons son similares a los Buttons, con la diferencia que al pulsarlos, permanece pulsado. Se crea con la funcion gtk_toggle_button_new() o gtk_toggle_button_new_with_label().
Ademas, los ToggleButtons poseen la señal "toggled", que se activa cada vez que el botón cambia de estado.
GtkWidget * toggle;
toggle = gtk_toggle_button_new_with_label("Botton Toggle");
gtk_signal_connect(GTK_OBJECT(toggle), "toggled",
GTK_SIGNAL_FUNC(funcion), NULL);
Los CheckButtons son similares a ToggleButton, con la diferencia que en vez de parecer botones, son una mezcla de un botón toggle con un label, de forma horizontal.
GtkWidget * boton;
boton = gtk_check_button_new_with_label("Etiqueta 1");
Los RadioButton son similares a los CheckButton, con la diferencia que solo puede elegirse una de las opciones (opciones mutuamente excluyentes). Son un poco mas complicadas de ocupar ya que es necesario dominar Listas Ligadas (visto en el primer capitulo de esta serie :-) ).
GtkWidget * radio;
GSList * grupo = NULL;
/* primero, crear el radio desde un grupo nulo */
radio = gtk_radio_button_new_with_label(NULL, "radio1");
/* agregar el radio al grupo */
grupo = gtk_radio_button_group (GTK_RADIO_BUTTON(radio));
/* agregar un nuevo radio al grupo */
radio = gtk_radio_button_new_with_label(grupo, "radio2");
grupo = gtk_radio_button_group (GTK_RADIO_BUTTON(radio));
/* repeat ad nauseam :-) */
La idea que se use una lista GSList para los RadioButtons es para enlazarlos en la elección de una alternativa entre aquellas que pertenezcan a la lista.
2.3 Frames
Los frames o marcos son contenedores que poseen un borde alrededor de ellos. Usados tambien para empaquetar widgets.
GtkWidget * frame;
frame = gtk_frame_new("Titulo del marco");
2.4 Un ejemplo completo
Aqui hay un codigo de un ejemplo para los widgets que ya hemos visto. Como ejercicio al lector, queda implementar señales a cada uno de los componentes.
#include <gtk/gtk.h>
int main (int argc, char * argv[])
{
GtkWidget * vbox, * hbox, * ventana, * check;
GtkWidget * cuadro, * vbox1, * toggle, * radio;
GSList * grupo;
gtk_init (&argc, &argv);
ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_signal_connect(GTK_OBJECT(ventana), "delete_event",
GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
gtk_container_border_width(GTK_CONTAINER(ventana), 10);
vbox = gtk_vbox_new(TRUE,3);
hbox = gtk_hbox_new(TRUE,3);
/* primer cuadro */
cuadro = gtk_frame_new("Cuadro 1");
vbox1 = gtk_vbox_new(TRUE, 3);
gtk_container_add(GTK_CONTAINER(cuadro), vbox1);
toggle = gtk_toggle_button_new_with_label("Toggle 1");
gtk_box_pack_start(GTK_BOX(vbox1), toggle, FALSE, FALSE, 0);
toggle = gtk_toggle_button_new_with_label("Toggle 1");
gtk_box_pack_start(GTK_BOX(vbox1), toggle, FALSE, FALSE, 0);
toggle = gtk_toggle_button_new_with_label("Toggle 1");
gtk_box_pack_start(GTK_BOX(vbox1), toggle, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), cuadro, FALSE, FALSE, 0);
/* segundo cuadro */
cuadro = gtk_frame_new("Cuadro 2");
vbox1 = gtk_vbox_new(TRUE, 3);
gtk_container_add(GTK_CONTAINER(cuadro), vbox1);
check = gtk_check_button_new_with_label("Check 1");
gtk_box_pack_start(GTK_BOX(vbox1), check, FALSE, FALSE, 0);
check = gtk_check_button_new_with_label("Check 2");
gtk_box_pack_start(GTK_BOX(vbox1), check, FALSE, FALSE, 0);
check = gtk_check_button_new_with_label("Check 3");
gtk_box_pack_start(GTK_BOX(vbox1), check, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), cuadro, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
/* tercer cuadro */
hbox = gtk_hbox_new(TRUE,3);
cuadro = gtk_frame_new("Cuadro 3");
vbox1 = gtk_vbox_new(TRUE, 3);
gtk_container_add(GTK_CONTAINER(cuadro), vbox1);
radio = gtk_radio_button_new_with_label (NULL, "radio1");
grupo = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
gtk_box_pack_start (GTK_BOX (vbox1), radio, TRUE, TRUE, 0);
radio = gtk_radio_button_new_with_label (grupo, "radio2");
grupo = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
gtk_box_pack_start (GTK_BOX (vbox1), radio, TRUE, TRUE, 0);
radio = gtk_radio_button_new_with_label (grupo, "radio3");
grupo = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
gtk_box_pack_start (GTK_BOX (vbox1), radio, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(hbox), cuadro, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
gtk_container_add(GTK_CONTAINER(ventana), vbox);
gtk_widget_show_all(ventana);
gtk_main();
return 0;
}
Valora este capítulo:
Autor y licencia de 'Programación en GTK+ (Tercera Parte) - Widgets Adicionales'
|
Opiniona sobre 'Programación en GTK+ (Tercera Parte) - Widgets Adicionales' (0)
Tu nombre debe tener tres caracteres como mínimo.
Es necesario que te des de alta con una cuenta de correo válida.
Es necesario que te des de alta con una cuenta de correo válida.
El contenido del título de tu opinión debe tener tres caracteres como mínimo.
Es obligatorio que selecciones una valoración del recurso.
El contenido del comentario de tu opinión debe tener tres caracteres como mínimo.
Opina sobre este tutorial |
Wikis relacionados con 'Programación en GTK+ (Tercera Parte) - Widgets Adicionales'
Esta es la tercera entrega de la serie de cinco articulos. Esta vez, veremos como...
Más »
En la edición anterior, se explicó las bases de Netfilter/IPTables. En esta segunda entrega, se...
Más »
Este es el Diccionario de Plantas Mágicas elaborado por nosotr@s. Esta basado en nuestra propia...
Más »
Entre todos los seres vivientes el hombre es el único que tiene que darse una...
Más »
Las manos y las palabras son, antes incluso que el arte, los órganos de comprensión...
Más »


