ProgramacionGTKenC/CapituloIV

De Wiki GNOME Chile
Revisión a fecha de 00:19 31 jul 2006; JuanCarlosInostroza (Discusión | contribuciones)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar

Contenido

Mas Widgets

Hemos visto hasta el momento los controles de ventana, empaquetamiento, botones y etiquetas. Ahora veremos unos cuantos controles que sirven para comunicarse con el usuario.

GtkEntry

Como el nombre lo indica, sirve para ingresar texto.

Veamos el siguiente ejemplo, muy simple:

#include <gtk/gtk.h>

int main (int argc, char * argv[])
{
  GtkWidget * ventana;
  GtkWidget * boton;
  GtkWidget * entrada;
  GtkWidget * caja;

  gtk_init(&argc, &argv);

  ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  boton = gtk_button_new_with_label("Click me");
  caja = gtk_vbox_new(TRUE,2);
  entrada = gtk_entry_new();
  
  gtk_box_pack_start ((GtkBox *) caja,
		      entrada,
		      TRUE,
		      TRUE,
		      2);

  gtk_box_pack_start ((GtkBox *) caja,
		      boton,
		      TRUE,
		      TRUE,
		      2);

  
  gtk_container_add((GtkContainer *) ventana, caja);
  gtk_widget_show_all(ventana);
  
  gtk_main();
  return 0;
}

Ahora, necesitamos tomar el texto al momento de hacer click con el boton. Tenemos bastantes acercamientos al problema

  • Variables Globales
  • Uso correcto de los parametros a entregar con la se~al

Personalmente, prefiero el segundo metodo. Entonces, necesitamos primero saber la funcion correcta para extraer la cadena ingresada en un GtkEntry. Esta funcion es gtk_entry_get_text().

const gchar* gtk_entry_get_text             (GtkEntry *entry);

Entonces, con esto en mente, modifiquemos el programa:

#include <gtk/gtk.h>

void leer_entrada (GtkButton * boton,
		   gpointer data)
{
  gchar * texto;
  texto = gtk_entry_get_text((GtkEntry *) data);
  g_print("El texto en la caja es %s\n",texto);

}

int main (int argc, char * argv[])
{
  GtkWidget * ventana;
  GtkWidget * boton;
  GtkWidget * entrada;
  GtkWidget * caja;

  gtk_init(&argc, &argv);

  ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  boton = gtk_button_new_with_label("Click me");
  caja = gtk_vbox_new(TRUE,2);
  entrada = gtk_entry_new();
  

  gtk_box_pack_start ((GtkBox *) caja,
		      entrada,
		      TRUE,
		      TRUE,
		      2);

  gtk_box_pack_start ((GtkBox *) caja,
		      boton,
		      TRUE,
		      TRUE,
		      2);

  
  gtk_container_add((GtkContainer *) ventana, caja);

  g_signal_connect((GObject *) boton, 
		   "clicked",
		   (GCallback ) leer_entrada,
		   (gpointer) entrada);
		   

  gtk_widget_show_all(ventana);
  
  gtk_main();
  return 0;
}

Combo Box

En un combo box, el usuario selecciona una de varias opciones. Para evitar complicaciones, vamos a reciclar los ejemplos anteriores sonrisa

Nota : debido al cambio de API entre GTK+ 1.X y GTK+ 2.X, el control paso de ser gtk_combo a gtk_combo_box. Este ejemplo usa la version antigua del control. Cuando veamos el control de arbol y listas, podremos ver el ejemplo real. Lo quedo debiendo.

#include <gtk/gtk.h>

int main (int argc, char * argv[])
{
  GtkWidget * ventana;
  GtkWidget * boton;
  GtkWidget * entrada;
  GtkWidget * caja;
  GtkWidget * combo;

  GList * opciones;

  gtk_init(&argc, &argv);

  ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  boton = gtk_button_new_with_label("Click me");
  caja = gtk_vbox_new(TRUE,2);
  entrada = gtk_entry_new();
  combo = gtk_combo_new();

  opciones = NULL;
  opciones = g_list_append(opciones, 
			   "Opcion 1");
  opciones = g_list_append(opciones,
			   "Opcion 2");
  opciones = g_list_append(opciones,
			   "Opcion 3");
  opciones = g_list_append(opciones,
			   "Opcion 4");


  gtk_combo_set_popdown_strings ((GtkCombo *) combo,
				 opciones);

  gtk_box_pack_start ((GtkBox *) caja,
		      entrada,
		      TRUE,
		      TRUE,
		      2);

  gtk_box_pack_start ((GtkBox *) caja,
		      combo,
		      TRUE,
		      TRUE,
		      2);

  gtk_box_pack_start ((GtkBox *) caja,
		      boton,
		      TRUE,
		      TRUE,
		      2);

  
  gtk_container_add((GtkContainer *) ventana, caja);

  gtk_widget_show_all(ventana);
  
  gtk_main();
  return 0;
}


Fijense en el peque~o detalle de la creacion del control y la asignacion de las opciones.

  GList * opciones;
  ...

  combo = gtk_combo_new();

  opciones = NULL;
  opciones = g_list_append(opciones, 
			   "Opcion 1");
  opciones = g_list_append(opciones,
			   "Opcion 2");
  opciones = g_list_append(opciones,
			   "Opcion 3");
  opciones = g_list_append(opciones,
			   "Opcion 4");

Asi, cualquiera de las opciones esta dentro de una lista ligada simple. Y relacionarlo al control, es mas facil aun:

gtk_combo_set_popdown_strings ((GtkCombo *) combo,
				 opciones);

La razon que por que fue removido (deprecado, en realidad) es para dar paso al uso de MVC (Modelo-Vista-Controlador) para el dise~o y populacion de datos en los controles.

Los que se den cuenta del detalle, las opciones son posible de modificar. Pero los cambios no se reflejan directamente en las opciones (ya que estas estan fijas, o "hardcoded" en el programa).

El ejemplo de modificacion queda pendiente hasta que lleguemos a MVC. Y falta poco.

Spinners

Estos controles seleccionan un valor, el que se modifica por dos flechas peque~as (hacia arriba y abajo).

Para usar un spinner, es necesario hablar de un control llamado GtkAdjustment. Este control permite representar en un control valores de "borde" o limite. Por ejemplo, para los scrollbars. Para crear un GtkAdjustment, se usa la funcion gtk_adjustment_new() con los siguientes parametros:

   * Valor inicial
   * Valor minimo
   * Valor maximo
   * Incremento
   * Incremento por pagina (saltos)
   * Tama~o de pagina


  1. include <gtk/gtk.h>

int main (int argc, char * argv[]) {

 GtkWidget * ventana;
 GtkWidget * boton;
 GtkWidget * entrada;
 GtkWidget * caja;
 GtkWidget * combo;
 GtkWidget * spinner;
 GtkAdjustment * ajuste;
 GList * opciones;
 gtk_init(&argc, &argv);
 ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 boton = gtk_button_new_with_label("Click me");
 caja = gtk_vbox_new(TRUE,2);
 entrada = gtk_entry_new();
 combo = gtk_combo_new();
 ajuste = (GtkAdjustment *) gtk_adjustment_new(1.0,

-100.0, 100.0, 0.5, 10.0, 0.0);

 spinner = gtk_spin_button_new(ajuste,

1, 1);

 opciones = NULL;
 opciones = g_list_append(opciones, 

"Opcion 1");

 opciones = g_list_append(opciones,

"Opcion 2");

 opciones = g_list_append(opciones,

"Opcion 3");

 opciones = g_list_append(opciones,

"Opcion 4");


 gtk_combo_set_popdown_strings ((GtkCombo *) combo,

opciones);

 gtk_box_pack_start ((GtkBox *) caja,

entrada, TRUE, TRUE, 2);

 gtk_box_pack_start ((GtkBox *) caja,

combo, TRUE, TRUE, 2);


 gtk_box_pack_start ((GtkBox *) caja,

spinner, TRUE, TRUE, 2);


 gtk_box_pack_start ((GtkBox *) caja,

boton, TRUE, TRUE, 2);


 gtk_container_add((GtkContainer *) ventana, caja);
 gtk_widget_show_all(ventana);
 
 gtk_main();
 return 0;

}


(Descargar codigo)

Sliders Los sliders son tanto verticales como horizontales, y sirven para seleccionar tambien en un rango, no numerico (mas visual o de porcentaje).

Y tambien usan el control de ajuste (GtkAdjustment).

Un ejemplo (viene con bonus):

  1. include <gtk/gtk.h>

int main (int argc, char * argv[]) {

 GtkWidget * ventana;
 GtkWidget * boton;
 GtkWidget * entrada;
 GtkWidget * caja;
 GtkWidget * combo;
 GtkWidget * spinner;
 GtkAdjustment * ajuste;
 GtkWidget * sliderh;
 GtkWidget * sliderv;
 GList * opciones;
 gtk_init(&argc, &argv);
 ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 boton = gtk_button_new_with_label("Click me");
 caja = gtk_vbox_new(TRUE,2);
 entrada = gtk_entry_new();
 combo = gtk_combo_new();
 ajuste = (GtkAdjustment *) gtk_adjustment_new(1.0,

-100.0, 100.0, 0.5, 10.0, 0.0);

 spinner = gtk_spin_button_new(ajuste,

1, 1);

 sliderh = gtk_hscale_new(ajuste);
 sliderv = gtk_vscale_new(ajuste);
 opciones = NULL;
 opciones = g_list_append(opciones, 

"Opcion 1");

 opciones = g_list_append(opciones,

"Opcion 2");

 opciones = g_list_append(opciones,

"Opcion 3");

 opciones = g_list_append(opciones,

"Opcion 4");


 gtk_combo_set_popdown_strings ((GtkCombo *) combo,

opciones);

 gtk_box_pack_start ((GtkBox *) caja,

entrada, TRUE, TRUE, 2);

 gtk_box_pack_start ((GtkBox *) caja,

combo, TRUE, TRUE, 2);


 gtk_box_pack_start ((GtkBox *) caja,

spinner, TRUE, TRUE, 2);


 gtk_box_pack_start ((GtkBox *) caja,

sliderh, TRUE, TRUE, 2);

 gtk_box_pack_start ((GtkBox *) caja,

sliderv, TRUE, TRUE, 2);

 gtk_box_pack_start ((GtkBox *) caja,

boton, TRUE, TRUE, 2);


 gtk_container_add((GtkContainer *) ventana, caja);
 gtk_widget_show_all(ventana);
 
 gtk_main();
 return 0;

}

(Descargar codigo)

Viene con bonus. La razon? Todos los controles que usan el mismo GtkAdjustment son afectados cuando uno es alterado.

Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Herramientas