Autore: Fabio Di Matteo
Ultima revisione: 05/06/2015 - 12:58
In questo articolo si trova una minimale introduzione al linguaggio Vala usando le librerie Gtk+-3.0 .
Andremo a caricare un'interfaccia realizzata con glade e utilizzeremo il sistema di callback per implementare una specie di contatore di click su di un bottone.
Tutorial interessanti: Introduction to GTK+ Programming Using Vala
simple.vala
using Gtk; //variabili globali static Entry txt; static int c=0; public void on_button1_clicked (Button source) { //implemento un contatore sull'etichetta del bottone c++; string testo= txt.get_text()+" "+ c.to_string(); source.label = testo; } int main (string[] args) { Gtk.init (ref args); try { //Provo a leggere il file della gui //Carico la gui var builder = new Builder (); builder.add_from_file ("gui.ui"); //Autoconnetto i segnali alla callbacks builder.connect_signals (null); //Prelevo il puntatore ad una casella di testo dell'interfaccia (entry1) txt = builder.get_object ("entry1") as Entry; txt.set_text("Prova vala sul campo... "); //assegno del testo //Prelevo il puntatore alla finestra principale (window1) var window = builder.get_object ("window1") as Window; //Mostro la finestra principale window.show_all (); Gtk.main (); } catch (Error e) { stderr.printf ("Problemi nel leggere il file della gui: %s\n", e.message); return 1; } return 0; }
CPP = valac OPTS = --pkg gtk+-3.0 --pkg gmodule-2.0 all: $(CPP) simple.vala $(OPTS) -o simple clean: rm simple
intermedio.vala
using Gtk; public class finestraPrincipale : GLib.Object { /* Campi */ public static Entry txt; public static Button btn; private static int c=0; /* Attenzione !!! Callbacks * * Attenzione perche' in glade il nome della callback da collegare * diventa "finestra_principale_on_button1_clicked", da notare la * trasformazione del camelcase. Tutto deve essere trasformato in * minuscolo e tra la lettera minuscola e quella maiuscola viene * aggiunto un underscore "_" . * * Dunque "finestraPrincipale.on_button1_clicked()" diventa nel * gestore dei segnali di Glade: "finestra_principale_on_button1_clicked" * * */ public void on_button1_clicked () { //implemento un contatore sull'etichetta del bottone c++; string testo= txt.get_text()+" "+ c.to_string(); btn.label = testo; } /* Construttore */ public finestraPrincipale() { } public void show() { try { //Provo a leggere il file della gui //Carico la gui var builder = new Builder (); builder.add_from_file ("gui.ui"); //Autoconnetto i segnali alla callbacks builder.connect_signals (null); //Prelevo il puntatore ad una casella di testo dell'interfaccia (entry1) txt = builder.get_object ("entry1") as Entry; txt.set_text("Prova vala sul campo... "); //assegno del testo btn=builder.get_object ("button1") as Button; //Prelevo il puntatore alla finestra principale (window1) var window = builder.get_object ("window1") as Window; //Mostro la finestra principale window.show_all (); } catch (Error e) { stderr.printf ("Problemi nel leggere il file della gui: %s\n", e.message); } } } int main (string[] args) { Gtk.init (ref args); finestraPrincipale myWin = new finestraPrincipale(); myWin.show(); //Ciclo principale Gtk Gtk.main (); return 0; }
Il makefile è praticamente lo stesso a quello usato per il primo esempio.
In merito al commento sulla trasformazione del nome della callbac su glade potete consultare anche la documentazione ufficiale Loading_User_Interface_from_XML_File .
main.vala
using Gtk; public class finestraPrincipale : GLib.Object { public static Button btn; public static Window window; public void on_button1_clicked () { window.set_title("Hai cliccato"); print("Hai cliccato!"); } /* Construttore */ public finestraPrincipale() { } public void show() { try { //Provo a leggere il file della gui //Carico la gui var builder = new Builder (); builder.add_from_resource("/myapp/risorse/gui.xml"); //Connetto i segnali alla callbacks builder.connect_signals (null); //Button1 btn=builder.get_object ("button1") as Button; btn.clicked.connect(on_button1_clicked); //Prelevo il puntatore alla finestra principale (window1) window = builder.get_object ("window1") as Window; window.destroy.connect(Gtk.main_quit); //Mostro la finestra principale window.show_all (); } catch (Error e) { stderr.printf ("Problemi nel leggere il file della gui: %s\n", e.message); } } } int main (string[] args) { Gtk.init (ref args); finestraPrincipale myWin = new finestraPrincipale(); myWin.show(); //Ciclo principale Gtk Gtk.main (); return 0; }
risorse.xml
<?xml version="1.0" encoding="UTF-8"?> <gresources> <gresource prefix="/myapp/risorse"> <file preprocess="xml-stripblanks">gui.xml</file> </gresource> </gresource>
makefile
CPP = valac-0.30 OPTS = --pkg gtk+-3.0 --pkg gmodule-2.0 all: glib-compile-resources --generate-source risorse.xml $(CPP) main.vala risorse.c $(OPTS) -o main clean: rm main