ProgramacionGTKenC/CapituloIV

De Wiki GNOME Chile
(Diferencias entre revisiones)
Saltar a: navegación, buscar
(Spinners)
(Mas Widgets)
 
Línea 44: Línea 44:
 
}</pre>
 
}</pre>
  
Ahora, necesitamos tomar el texto al momento de hacer click con el boton.
+
Ahora, necesitamos tomar el texto al momento de hacer click con el botón.
 
Tenemos bastantes acercamientos al problema
 
Tenemos bastantes acercamientos al problema
  
 
* Variables Globales
 
* Variables Globales
* Uso correcto de los parametros a entregar con la se~al
+
* Uso correcto de los parametros a entregar con la señal
  
 
Personalmente, prefiero el segundo metodo.
 
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().
+
Entonces, necesitamos primero saber la función correcta para extraer la cadena ingresada en un GtkEntry. Esta funcion es gtk_entry_get_text().
  
 
<pre>const gchar* gtk_entry_get_text            (GtkEntry *entry);</pre>
 
<pre>const gchar* gtk_entry_get_text            (GtkEntry *entry);</pre>
Línea 113: Línea 113:
  
 
En un combo box, el usuario selecciona una de varias opciones.
 
En un combo box, el usuario selecciona una de varias opciones.
Para evitar complicaciones, vamos a reciclar los ejemplos anteriores sonrisa
+
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.
 
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.
Línea 179: Línea 179:
  
  
Fijense en el peque~o detalle de la creacion del control y la asignacion de las opciones.
+
Fijense en el pequeño detalle de la creación del control y la asignación de las opciones.
  
 
<pre>  GList * opciones;
 
<pre>  GList * opciones;
Línea 202: Línea 202:
 
opciones);</pre>
 
opciones);</pre>
  
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.
+
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 estan fijas, o "hardcoded" en el programa).
+
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 modificacion queda pendiente hasta que lleguemos a MVC. Y falta poco.
+
El ejemplo de modificación queda pendiente hasta que lleguemos a MVC. Y falta poco.
  
 
== Spinners ==
 
== Spinners ==
Estos controles seleccionan un valor, el que se modifica por dos flechas peque~as (hacia arriba y abajo).
+
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 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:
+
 
 +
Para crear un GtkAdjustment, se usa la función gtk_adjustment_new() con los siguientes parametros:
 
* Valor inicial
 
* Valor inicial
* Valor minimo
+
* Valor mínimo
* Valor maximo
+
* Valor máximo
 
* Incremento
 
* Incremento
 
* Incremento por pagina (saltos)
 
* Incremento por pagina (saltos)
* Tama~o de pagina
+
* Tamaño de pagina
  
 +
Veamos un ejemplo
  
 
<pre>#include <gtk/gtk.h>
 
<pre>#include <gtk/gtk.h>
Línea 305: Línea 307:
 
== Sliders ==  
 
== Sliders ==  
  
Los sliders son tanto verticales como horizontales, y sirven para seleccionar tambien en un rango, no numerico (mas visual o de porcentaje).
+
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).
 
+
Y tambien usan el control de ajuste (GtkAdjustment).
+
  
Un ejemplo (viene con bonus):
+
Un ejemplo:
  
 
<pre>#include <gtk/gtk.h>
 
<pre>#include <gtk/gtk.h>
Línea 412: Línea 412:
  
 
Viene con bonus.
 
Viene con bonus.
La razon? Todos los controles que usan el mismo GtkAdjustment son afectados cuando uno es alterado.
+
La razón? Todos los controles que usan el mismo GtkAdjustment son afectados cuando uno es alterado.

Última revisión de 16:41 8 ago 2006

Contenido

[editar] 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.

[editar] 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;
}

[editar] 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.

[editar] 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;
}

[editar] 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