Modelo GtkListStore en C
GtkListStore es un modelo para el Widget GtkTreeView que permite almacenar los datos como un arreglo o tabla.
Para crear dicho control debemos crear GtkTreeView y asignarle el modelo de lista. Para crear nuestra lista necesitaremos declarar los siguientes Widgets, variables y un evento.
/* Declaraciones */ GtkWidget *treeview, *scroll; GtkListStore *store; GtkTreeIter iter; guint i = 0; /* Declaramos el método para crear las columnas */ static void setup_tree_view (GtkWidget*);
Puesto que el Widget GtkListStore se basa en un TreeView debemos crear dicho control especificando las columnas que utilizaremos.
/* Creamos el Widget */ treeview = gtk_tree_view_new(); setup_tree_view(treeview);
Para crear una nueva lista utilizamos la función gtk_list_store_new() en donde especificamos la cantidad de columnas y los tipos de datos que almacenarán dichas columnas. En este caso utilizaremos dos columnas del tipo GString.
/* Especificamos que tipos de datos almacenará el Widget */ store = gtk_list_store_new (COLUMNAS, G_TYPE_STRING, G_TYPE_STRING);
La variable COLUMNAS la podemos sustituir por el número 2, en este ejemplo utilizamos la siguiente enumeración:
enum {
SOFTWARE = 0,
LICENCIAS,
COLUMNAS
};Puesto que el control que hemos creado en un GtkTreeView, debemos especificar que el control es un GtkListStore. Una vez que especificamos el modelo del Widget podemos agregar los datos con un ciclo. Los datos los tomaremos del arreglo ListaItem lista[].
/* Especificamos que el Widget es un GtkListStore */
gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store));
g_object_unref (store);
scroll = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
/* Agregamos los datos */
while (i != 6) {
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, SOFTWARE, lista[i].software, LICENCIAS, lista[i].licencias, -1);
i++;
}Nuestro código completo queda de la siguiente manera:
#include <gtk/gtk.h>
enum {
SOFTWARE = 0,
LICENCIAS,
COLUMNAS
};
typedef struct {
gchar *software;
gchar *licencias;
} ListaItem;
const ListaItem lista[] = {
{ "openSUSE", "Software libre" },
{ "OpenOffice.org", "Software libre" },
{ "RHLE 5", "Software libre" },
{ "Microsoft Windows", "Privada" },
{ "MacOS X", "Privada" },
{ "Debian", "Software libre" }
};
/* Declaramos el método para crear las columnas */
static void setup_tree_view (GtkWidget*);
static void destroy (GtkWidget*, gpointer);
static gboolean destroy_event (GtkWidget*, GdkEvent*, gpointer);
int main (int argc, char *argv[]) {
GtkWidget *ventana;
/* Declaraciones */
GtkWidget *treeview, *scroll;
GtkListStore *store;
GtkTreeIter iter;
guint i = 0;
gtk_init (&argc, &argv);
ventana = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request (ventana, 400, 200);
gtk_window_set_title (GTK_WINDOW (ventana), "GtkListStore");
/* Creamos el Widget */
treeview = gtk_tree_view_new();
setup_tree_view(treeview);
/* Especificamos que tipos de datos almacenará el Widget */
store = gtk_list_store_new (COLUMNAS, G_TYPE_STRING, G_TYPE_STRING);
/* Especificamos que el Widget es un GtkListStore */
gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store));
g_object_unref (store);
scroll = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
/* Agregamos los datos */
while (i != 6) {
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, SOFTWARE, lista[i].software, LICENCIAS, lista[i].licencias, -1);
i++;
}
gtk_container_add (GTK_CONTAINER (scroll), treeview);
gtk_container_add (GTK_CONTAINER (ventana), scroll);
g_signal_connect (G_OBJECT (ventana), "destroy", G_CALLBACK (destroy), NULL);
g_signal_connect (G_OBJECT (ventana), "destroy_event", G_CALLBACK (destroy_event), NULL);
gtk_widget_show_all (ventana);
gtk_main ();
return 0;
}
/* Agregamos dos columnas: Software y Licencia */
static void setup_tree_view (GtkWidget *treeview) {
GtkCellRenderer *renderer;
GtkTreeViewColumn *columna;
/* Columna 1 */
renderer = gtk_cell_renderer_text_new();
columna = gtk_tree_view_column_new_with_attributes("Software", renderer, "text", SOFTWARE, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), columna);
/* Columna 2 */
renderer = gtk_cell_renderer_text_new();
columna = gtk_tree_view_column_new_with_attributes("Licencia", renderer, "text", LICENCIAS, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), columna);
}
static void destroy (GtkWidget *window, gpointer data) {
gtk_main_quit ();
}
static gboolean destroy_event (GtkWidget *window, GdkEvent *event, gpointer data) {
return FALSE;
}$ gcc -Wall -g Lista.c -o Lista `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0` $ ./Lista

Puedes encontrar más interfaces para utilizar este Widget en GtkListStore – GTK+ Reference Manual.
