Indice

Accedere ai widget tramite gtkbuilder

Autore: Fabio Di Matteo
Ultima revisione: 29/05/2015 - 10:59

Andremo a vedere come accedere e manipolare i widget di una gui realizzata tramite glade con gtkbuilder in uno “scenario reale” . Per spiegazioni sul makefile vedere l'articolo Mettere il file della gui creata con glade dentro l'eseguibile .

Come prima cosa occorre “estrarre” il puntatore al widget che vogliamo usare tramite la funzione mylabel=gtk_builder_get_object() in questo modo:

mylabel=gtk_builder_get_object (xml,"label1" );

dove xml è il puntatore alla nostra gui glade creato con xml = gtk_builder_new() e label1 è il nome del nostro widget.
Nel mio caso voglio semplicemente modificare il testo di una label al click su un button. Dunque ho messo la variabile globale mylabel in un header incluso sia nel main.c che in callbacks.c . Di seguito ecco il codice completo.

Codice

main.c

#include <gtk/gtk.h>                                                //includo le librerie gtk e glade.
#include "callbacks.h" 
 
GtkBuilder *xml;                                                 //questo è il puntatore al file xml che contiene l'interfaccia  
GtkWidget  *widget;                                              //questa variabile serve per recuperare di volta in volta il  
 
 
void on_MainWindow_delete_event(GtkWidget *widget, gpointer user_data)        //altra callback associata alla chiusura della 
{                                                                         // finestra 
    gtk_main_quit();
}
 
 
 
int
main (int argc, char *argv[])
{
  	gtk_init (&argc, &argv);
  	GError* error = NULL;
	gchar* glade_file = g_build_filename(g_get_tmp_dir(),"gui.xml", NULL);
 
	// Copio il file dalla gui dalle risorse a una cartella temporanea
	// (le gtk+2 non possono caricare direttamente il file).
	GFile*  mySRC =  g_file_new_for_uri("resource:///org/myapp/res/gui.xml");
	GFile*  myDEST =  g_file_new_for_path(glade_file);
	g_file_copy (mySRC,  myDEST,  G_FILE_COPY_OVERWRITE, NULL, NULL,  NULL,    &error);
 
 
    /*Infine carica come disolito il file dell'interfaccia */
	xml = gtk_builder_new ();
	if (!gtk_builder_add_from_file (xml, glade_file, &error))
	  {
		g_warning ("Couldn't load builder file: %s", error->message);
		g_error_free (error);
	  }
 
	mylabel=gtk_builder_get_object (xml,"label1" );
 
 
	 /* connette tutti gli eventi dei widget alle rispettive funzioni */
   	 gtk_builder_connect_signals (xml, NULL);
 
 
      	/* Avvia il ciclo principale delle gtAvvia il ciclo principale delle gtk*/ 
	gtk_main ();
 
  return 0;
 
}

callbacks.h

GtkLabel *mylabel ;
 
void button1_clicked_cb(GtkWidget *widget, gpointer user_data) ; 

callbacks.c

#include <gtk/gtk.h>   
#include "callbacks.h"
 
void button1_clicked_cb(GtkWidget *widget, gpointer user_data)
{
        //Conta i click su un button in una label(mylabel)
        static gint count;
	gchar txt[40];
	count++;
 
	g_sprintf(txt,"Cliccato %d volte\n",count ); 
	gtk_label_set_text( mylabel, txt );
 
}

Il makefile

CPP = gcc
OPTS = `pkg-config --cflags --libs gio-2.0 gtk+-2.0 gmodule-2.0` 

all:
	glib-compile-resources --generate-source resource.xml
	$(CPP)  resource.c  callbacks.c main.c  -o main $(OPTS)

clean:
	rm main