ProgramacionGTKenC/CapituloIV

De Wiki GNOME Chile
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 botón. 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 función 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 :)

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 creación del control y la asignación 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 razón que por que fue removido (deprecado, en realidad) es para dar paso al uso de MVC (Modelo-Vista-Controlador) para el diseño y populación 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 están fijas, o "hardcoded" en el programa).

El ejemplo de modificación 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 función gtk_adjustment_new() con los siguientes parametros:

  • Valor inicial
  • Valor mínimo
  • Valor máximo
  • Incremento
  • Incremento por pagina (saltos)
  • Tamaño de pagina

Veamos un ejemplo

#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;
}

Sliders

Los sliders son tanto verticales como horizontales, y sirven para seleccionar también en un rango, no numérico (mas visual o de porcentaje). Tambien usan el control de ajuste (GtkAdjustment).

Un ejemplo:

#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;
}


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

Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Herramientas