Listo !!
Ya pude lograrlo !!
Les dejo (a quien le pueda servir, o le interese) el codigo completo.
Vuelvo a insistir: que complicado que es GTK !!!!!!
Saludos
MA_Xx
/*
* Taller de Programación I (Veiga)
* Fecha: 7 / 08 / 2007 Cuatrimestre: 1º / 2007 Tema: 4
*
* 7) Escriba una rutina que cargue un combo con 12 elementos.
* Cada uno de ellos deberá tener el nombre de un mes como nombre visible
* y la cantidad de días de ese mes como valor asociado.
*
* */
#include <gtk/gtk.h>
#include <glib/gprintf.h>
#include <string.h>
/* DEFINICION DE LA ESTRUCTURA DE LOS ITEMS DE LA LISTA DEL COMBOBOX */
enum {
COLUMN_STRING,
COLUMN_INT,
N_COLUMNS
};
/*
* Callback para el ItemChanged del ComboBox
* */
void combo_selected_item(GtkWidget *widget) {
/*
*************************************************************************
MOSTRAMOS EL ITEM SELECCIONADO: El texto y el valor asociado
*************************************************************************
*/
g_printf("Item Changed...\n");
GtkTreeModel *model;
GtkTreeIter iter;
GValue val;
gtk_combo_box_get_active_iter (GTK_COMBO_BOX(widget), &iter);
model = gtk_combo_box_get_model (GTK_COMBO_BOX(widget));
memset (&val, 0, sizeof (val));
gtk_tree_model_get_value (model, &iter, COLUMN_STRING, &val);
g_printf("New Item: %s \n", g_value_get_string (&val));
g_value_unset(&val);
memset (&val, 0, sizeof (val));
gtk_tree_model_get_value (model, &iter, COLUMN_INT, &val);
g_printf("New Data: %d \n", g_value_get_int (&val));
g_value_unset(&val);
fflush(stdout);
}
/*
* Creamos la lista para el ComboBox con los nombres de Meses
* y un entero asociado que indica los dias que tiene cada mes
*
* */
GtkListStore * create_lista_meses() {
GtkListStore * list_store;
GtkTreeIter iter;
list_store = gtk_list_store_new (N_COLUMNS,
G_TYPE_STRING,
G_TYPE_INT);
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter,
COLUMN_STRING, "Enero",
COLUMN_INT, 31,
-1);
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter,
COLUMN_STRING, "Febrero",
COLUMN_INT, 28,
-1);
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter,
COLUMN_STRING, "Marzo",
COLUMN_INT, 31,
-1);
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter,
COLUMN_STRING, "Abril",
COLUMN_INT, 30,
-1);
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter,
COLUMN_STRING, "Mayo",
COLUMN_INT, 31,
-1);
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter,
COLUMN_STRING, "Junio",
COLUMN_INT, 30,
-1);
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter,
COLUMN_STRING, "Julio",
COLUMN_INT, 31,
-1);
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter,
COLUMN_STRING, "Agosto",
COLUMN_INT, 31,
-1);
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter,
COLUMN_STRING, "Septiembre",
COLUMN_INT, 30,
-1);
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter,
COLUMN_STRING, "Octubre",
COLUMN_INT, 31,
-1);
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter,
COLUMN_STRING, "Noviembre",
COLUMN_INT, 30,
-1);
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter,
COLUMN_STRING, "Diciembre",
COLUMN_INT, 31,
-1);
return list_store;
}
/*
* GTK MAIN:
* ComboBox con los meses del año
* y la cantidad de dias de cada mes como valor asociado
*
* */
int combobox_maxx(int argc, char **argv) {
GtkWidget * ventana;
GtkWidget * combo;
GtkListStore * list_store;
GtkCellRenderer * renderer;
gtk_init(&argc, &argv);
/*
* Creamos la lista para el ComboBox con los nombres de Meses
* y un entero asociado que indica los dias que tiene cada mes
*
* */
list_store = create_lista_meses();
/* Creamos el ComboBox a partir de la lista de arriba */
combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(list_store));
/* Atributos visuales de la lista desplegable del Combo */
renderer = gtk_cell_renderer_text_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE);
/* ESTE INDICA CUAL SERA EL CAMPO DE LA LISTA QUE SE MUESTRA
(COLUMN_STRING en nuestro caso) */
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), renderer,
"text", COLUMN_STRING, NULL);
/* setea el item activo default (el primero) */
gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
/* callback para el ItemChanged del ComboBox */
g_signal_connect(G_OBJECT(combo), "changed",
G_CALLBACK(combo_selected_item), NULL );
/* Creamos la ventana */
ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width(GTK_CONTAINER(ventana), 10);
/* Callbacks para que al cerrarse la ventana se termine la aplicacion */
g_signal_connect(G_OBJECT(ventana), "delete_event",
G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(ventana), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
/* Agregamos el ComboBox directamente en la ventana */
gtk_container_add(GTK_CONTAINER(ventana), combo);
/* LISTO !! */
gtk_widget_show_all(ventana);
gtk_main();
return 0;
}
On Sun, Dec 14, 2008 at 2:07 AM, Maximiliano Milicich <
[email protected]> wrote:
> Bueno...lo he logrado !!
>
> Me faltaba describir el CellLayout...en donde se indica cual sera el campo
> a mostrar...
> (fuente:
> https://stage.maemo.org/svn/maemo/projects/haf/trunk/gtk+/tests/testcombo.c
> )
>
> Ahora lo q me faltaria para cerrar el tema es COMO DEMONIOS hago para
> obtener la data asociada a la fila seleccionada cada vez que cambia el valor
> del Combo...
>
> A quien tenga ganas de ayudarme, mas que agradecido....=)
>
> Aca paso el codigo que tengo hasta ahora:
>
> #include <gtk/gtk.h>
> #include <glib/gprintf.h>
>
> enum {
> COLUMN_STRING,
> COLUMN_INT,
> N_COLUMNS
> };
>
> void combo_selected_item(GtkWidget *widget) {
>
> /*
> *************************************************************************
> COMO HAGO PARA OBTENER LA DATA ASOCIADA AL ITEM SELECCIONADO ???????????
> *************************************************************************
> */
>
> g_printf("Item Changed...\n");
> fflush(stdout);
> }
>
>
> int combobox_maxx(int argc, char **argv) {
>
> GtkWidget * ventana;
> GtkWidget * combo;
>
> GtkListStore *list_store;
> GtkTreeIter iter;
> GtkCellRenderer *renderer;
>
> gtk_init(&argc, &argv);
>
> /*
> * Creamos la lista para el ComboBox con los nombres de Meses
> * y un entero asociado que indica los dias que tiene cada mes
> *
> * */
> list_store = gtk_list_store_new (N_COLUMNS,
> G_TYPE_STRING,
> G_TYPE_INT);
>
> gtk_list_store_append (list_store, &iter);
> gtk_list_store_set (list_store, &iter,
> COLUMN_STRING, "Enero",
> COLUMN_INT, 31,
> -1);
>
> gtk_list_store_append (list_store, &iter);
> gtk_list_store_set (list_store, &iter,
> COLUMN_STRING, "Febrero",
> COLUMN_INT, 28,
> -1);
>
> gtk_list_store_append (list_store, &iter);
> gtk_list_store_set (list_store, &iter,
> COLUMN_STRING, "Marzo",
> COLUMN_INT, 31,
> -1);
>
> gtk_list_store_append (list_store, &iter);
> gtk_list_store_set (list_store, &iter,
> COLUMN_STRING, "Abril",
> COLUMN_INT, 30,
> -1);
>
> /* Creamos el ComboBox a partir de la lista de arriba */
> combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(list_store));
>
> /* Atributos visuales de la lista desplegable del Combo */
> renderer = gtk_cell_renderer_text_new ();
> gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE);
> /* ESTE INDICA CUAL SERA EL CAMPO DE LA LISTA QUE SE MUESTRA
> (COLUMN_STRING en nuestro caso) */
> gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), renderer,
> "text", COLUMN_STRING, NULL);
>
> /* setea el item activo default (el primero) */
> gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
>
> /* callback para el ItemChanged del ComboBox */
> g_signal_connect(G_OBJECT(combo), "changed",
> G_CALLBACK(combo_selected_item), NULL );
>
> /* Creamos la ventana */
> ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
> gtk_container_set_border_width(GTK_CONTAINER(ventana), 10);
>
> /* Callbacks para que al cerrarse la ventana se termine la aplicacion
> */
> g_signal_connect(G_OBJECT(ventana), "delete_event",
> G_CALLBACK(gtk_main_quit), NULL);
> g_signal_connect(G_OBJECT(ventana), "destroy",
> G_CALLBACK(gtk_main_quit), NULL);
>
> /* Agregamos el ComboBox directamente en la ventana */
> gtk_container_add(GTK_CONTAINER(ventana), combo);
>
> /* LISTO !! */
> gtk_widget_show_all(ventana);
>
> gtk_main();
>
> return 0;
> }
>
> Muchas gracias !
> Saludos
> MA_Xx
>
> PS: que complicado que es este GTK !!!!!!!!!!!! =(
>
>
> On Sat, Dec 13, 2008 at 10:34 PM, Maximiliano Milicich <
> [email protected]> wrote:
>
>> Ricardo:
>> Muchas gracias...pero estos ejemplos de combo que me pasas tienen solo
>> entradas de texto, sin valor asociado...
>>
>> Yo queria saber como se hace para construir un combo con una lista de
>> opciones, en la q cada una tenga un valor asociado...de forma de al elegir
>> una yo pueda tener el valor asociado (un ID)
>>
>> Mi duda surge a partir de un ejercicio de final de Taller 1 Veiga, en la
>> que se pide hacer un combo con los meses del año y cada mes tenga como valor
>> asociado la cantidad de dias en el mes (enero (31), febrero (28), marzo
>> (31), abril (30), ....)
>>
>> Juro que no puedo encontrar la forma de hacerlo...
>> Tengo este codigo, lo unico que pude construir en base al tutorial oficial
>> de GTK: me aparece la ventana con el combo, me aparecen hasta las 4 lineas
>> en la lista desplegable, pero no me aparecen las opciones como texto
>> (aparecen vacias)
>>
>>
>> #include <gtk/gtk.h>
>>
>> enum {
>> COLUMN_STRING,
>> COLUMN_INT,
>> COLUMN_BOOLEAN,
>> N_COLUMNS
>> };
>>
>> int combobox(int argc, char **argv) {
>>
>> GtkWidget * ventana;
>> GtkWidget * combo;
>>
>> GtkListStore *list_store;
>> GtkTreeIter iter;
>>
>> gtk_init(&argc, &argv);
>>
>> list_store = gtk_list_store_new (N_COLUMNS,
>> G_TYPE_STRING,
>> G_TYPE_INT,
>> G_TYPE_BOOLEAN);
>>
>> gtk_list_store_append (list_store, &iter);
>> gtk_list_store_set (list_store, &iter,
>> COLUMN_STRING, "some_data1",
>> COLUMN_INT, 1,
>> COLUMN_BOOLEAN, FALSE,
>> -1);
>> gtk_list_store_append (list_store, &iter);
>> gtk_list_store_set (list_store, &iter,
>> COLUMN_STRING, "some_data2",
>> COLUMN_INT, 2,
>> COLUMN_BOOLEAN, FALSE,
>> -1);
>> gtk_list_store_append (list_store, &iter);
>> gtk_list_store_set (list_store, &iter,
>> COLUMN_STRING, "some_data3",
>> COLUMN_INT, 3,
>> COLUMN_BOOLEAN, FALSE,
>> -1);
>> gtk_list_store_append (list_store, &iter);
>> gtk_list_store_set (list_store, &iter,
>> COLUMN_STRING, "some_data4",
>> COLUMN_INT, 4,
>> COLUMN_BOOLEAN, FALSE,
>> -1);
>>
>> combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(list_store));
>>
>> ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
>>
>> g_signal_connect(G_OBJECT(ventana), "delete_event",
>> G_CALLBACK(gtk_main_quit), NULL);
>> g_signal_connect(G_OBJECT(ventana), "destroy",
>> G_CALLBACK(gtk_main_quit), NULL);
>> gtk_container_set_border_width(GTK_CONTAINER(ventana), 10);
>>
>> gtk_container_add(GTK_CONTAINER(ventana), combo);
>>
>> gtk_widget_show(combo);
>>
>> gtk_widget_show(ventana);
>>
>> gtk_main();
>>
>> return 0;
>> }
>>
>>
>> A quien me pueda ayudar, muchas gracias !!!!!!!
>> MA_Xx
>>
>>
>>
>> On Fri, Dec 5, 2008 at 12:58 AM, Ricardo Markiewicz <[email protected]>wrote:
>>
>>> 2008/12/5 Ricardo Markiewicz <[email protected]>:
>>> > 2008/12/5 Maximiliano Milicich <[email protected]>:
>>> >> Hola:
>>> >> Alguien q sepa de GTK+2.0 (en C) me podra pasar un ejemplo de como
>>> construir
>>> >> un combo box con entradas y valores asociados ?
>>> >> Puedo lograr un Combo Box con solo entradas de texto, pero me estoy
>>> >> volviendo loco intentando encontrar la manera de que el Combo tenga
>>> cada
>>> >> elemento con un valor asociado (digamos, un numero para cada entrada
>>> de
>>> >> texto)...
>>> >>
>>> >> Ejemplo
>>> >> Juan (valor asociado 1)
>>> >> Pepe (valor asociado 2)
>>> >> Jose (valor asociado 3)
>>> >>
>>> >> Me lei el tutorial oficial de GTK de punta a punta y no hay un ejemplo
>>> de
>>> >> eso...
>>> >> Y en el GTK Reference Manual no dan ejemplos...solo explican que hace
>>> cada
>>> >> funcion y no puedo llegar a entender como hacerlo... =(
>>> >
>>> > http://library.gnome.org/devel/gtk-tutorial/stable/x1065.html
>>>
>>> Y http://zetcode.com/tutorials/gtktutorial/gtkwidgetsII/ también te
>>> puede servir.
>>>
>>> Saludos
>>>
>>> --
>>> --
>>> Ricardo Markiewicz
>>> http://www.gazer.com.ar/
>>>
>>> _______________________________________________
>>> Lista de correo Programacion.
>>> [email protected]
>>> http://listas.fi.uba.ar/mailman/listinfo/programacion
>>>
>>
>>
>
_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion