{"id":356,"date":"2019-11-03T22:58:04","date_gmt":"2019-11-03T21:58:04","guid":{"rendered":"http:\/\/www.forlex.it\/blog\/?p=356"},"modified":"2019-11-03T22:58:05","modified_gmt":"2019-11-03T21:58:05","slug":"interfacce-grafiche-per-i-nostri-programmi-in-gtk-parte-2","status":"publish","type":"post","link":"http:\/\/www.forlex.it\/index.php\/2019\/11\/03\/interfacce-grafiche-per-i-nostri-programmi-in-gtk-parte-2\/","title":{"rendered":"Interfacce grafiche per i nostri programmi in GTK+ &#8211; parte 2 &#8211;"},"content":{"rendered":"\n<p>Nella prima parte abbiamo creato la nostra prima finestra in Gtk+, adesso cercheremo di aggiungere alla nostra finestra tutti i controlli necessari per&nbsp; interfacciarsi al meglio con l&#8217;utente finale.<\/p>\n\n\n\n<p>Il widget button (e relativo segnale)<\/p>\n\n\n\n<p>Per prima cosa aggiungiamo alla nostra finestra una bel tasto, che gestisce la chiusura della stessa, in poche parole un bottone che chiude la finestra come se cliccassimo la \u201cX\u201d in alto a destra (Figura 1).<\/p>\n\n\n\n<p>#include &lt;gtk\/gtk.h&gt;<\/p>\n\n\n\n<p>static void destroy (GtkWidget*, gpointer);<br>static gboolean delete_event (GtkWidget*, GdkEvent*, gpointer);<\/p>\n\n\n\n<p>int main (int argc, char *argv[])<br>{<br>\/\/Aggiungiamo un nuovo widget e lo chiamiamo button.<br>GtkWidget *window, *button;<br>gtk_init (&amp;argc, &amp;argv);<br>window = gtk_window_new (GTK_WINDOW_TOPLEVEL);<br>gtk_window_set_title (GTK_WINDOW (window), &#8220;Hello World&#8221;);<br>gtk_window_set_gravity (GTK_WINDOW (window), GDK_GRAVITY_CENTER);<br>gtk_container_set_border_width (GTK_CONTAINER (window), 10);<br>gtk_widget_set_size_request (window, 200, 100);<br>g_signal_connect (G_OBJECT (window), &#8220;destroy&#8221;, G_CALLBACK (destroy), NULL);<br>g_signal_connect (G_OBJECT (window), &#8220;delete_event&#8221;, G_CALLBACK (delete_event), NULL);<br>\/\/Creiamo il tasto con la label CHIUDI e con il mnemonico CTRL+C.<br>button = gtk_button_new_with_mnemonic (&#8220;_CHIUDI&#8221;);<br>\/\/Gli diamo anche graficamente l&#8217;aspetto 3D.<br>gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NORMAL);<br>\/\/Connettiamo il nostro bottone all&#8217;evento clicked e alla pressione del tasto richiamiamo la funzione destroy.<br>g_signal_connect_swapped (G_OBJECT (button), &#8220;clicked&#8221;, G_CALLBACK (destroy), NULL);<br>\/\/Ultima cosa aggiungiamo il nostro bottone alla finestra che la consideriamo per questo esempio come un contenitore ddi oggetti widget.<br>gtk_container_add (GTK_CONTAINER (window), button);<br>gtk_widget_show_all (window);<br>gtk_main ();<br>return 0;<br>}<\/p>\n\n\n\n<p>static void destroy (GtkWidget *window, gpointer data)<br>{<br>gtk_main_quit ();<br>}<\/p>\n\n\n\n<p>static gboolean delete_event (GtkWidget *window, GdkEvent *event, gpointer data)<br>{<br>return FALSE;<br>}<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" src=\"http:\/\/www.forlex.it\/wp-content\/uploads\/2019\/11\/gtk\/gtk-part2-win-1.jpg\" alt=\"\" class=\"wp-image-293\" width=\"218\" height=\"144\" srcset=\"http:\/\/www.forlex.it\/wp-content\/uploads\/2019\/11\/gtk\/gtk-part2-win-1.jpg 204w, http:\/\/www.forlex.it\/wp-content\/uploads\/2019\/11\/gtk\/gtk-part2-win-1-100x66.jpg 100w, http:\/\/www.forlex.it\/wp-content\/uploads\/2019\/11\/gtk\/gtk-part2-win-1-150x99.jpg 150w, http:\/\/www.forlex.it\/wp-content\/uploads\/2019\/11\/gtk\/gtk-part2-win-1-200x132.jpg 200w\" sizes=\"(max-width: 218px) 100vw, 218px\" \/><\/figure>\n\n\n\n<p>Una prima premessa sui container<\/p>\n\n\n\n<p>Un discorso a parte va fatto sui container; i container come descritto sul programma \u00e8 un widget che pu\u00f2 contenere altri widget, per\u00f2 nel caso appena descritto la nostra window potr\u00e0 contenere sono un oggetto widget. Se volessimo pi\u00f9 widget nel nostro contenitore, non dovremo utilizzare la nostra window ma dovremo utilizzare dei layout predefiniti in GTK+ (hbox, vbox, table&#8230;). A loro volta i layout possono essere usati come contenitori di widget.<br>I contenitori sono un po&#8217; complicati da spiegare ma a sua volta molto semplici da usare una volta che si comincia ad avere un po&#8217; pi\u00f9 di confidenza con le GTK+, con calma si fa tutto.<br>I Signals e le Callback<br>Dopo aver fatto questa piccola premessa sui container ritorniamo al nostro bottone che permette la chiusura della nostra window, GTK+ permette inoltre di utilizzare la seguente riga di connessione al segnale di click:<br>g_signal_connect (G_OBJECT (button), &#8220;clicked&#8221;, G_CALLBACK (gtk_widget_destroy), (gpointer) window);<br>Praticamente al click del nostro bottone verr\u00e0 richiamata la funzione gtk_widget_destroy alla quale verr\u00e0 passata la nostra window per la definitiva chiusura. Quindi se al posto della nostra window come parametro passavamo il nostro button, dalla nostra window sparir\u00e0 solamente il tasto che abbiamo creato.<\/p>\n\n\n\n<p>In poche parole si pu\u00f2 connettere ad un oggetto, o meglio, a qualsiasi oggetto widgets, un segnale, che pu\u00f2 essere il semplice click, doppio click, etc&#8230; e appena questo segnale viene sollevato dall&#8217;oggetto widget a cui \u00e8 connesso verr\u00e0 eseguita la callback. Alla callback inoltre pu\u00f2 essere passato un altro oggetto widget che subir\u00e0 il segnale sollevato.<\/p>\n\n\n\n<p>Il widget label<\/p>\n\n\n\n<p>Adesso, al posto di un bottone mettiamo una label (etichetta) con la solita scritta \u201cCiao Mondo\u201d, senza riscrivere tutto il codice andremo ad aggiungere un nuovo oggetto widget:<\/p>\n\n\n\n<p>GtkWidget *window, *button, *label;<\/p>\n\n\n\n<p>Andremo poi a commentare le righe:<\/p>\n\n\n\n<p>button = gtk_button_new_with_mnemonic (&#8220;_CHIUDI&#8221;);<br>gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NORMAL);<br>g_signal_connect_swapped (G_OBJECT (button), &#8220;clicked&#8221;, G_CALLBACK (destroy), NULL);<br>gtk_container_add (GTK_CONTAINER (window), button);<\/p>\n\n\n\n<p>Ed andremo a scrivere:<\/p>\n\n\n\n<p>\/\/Creiamo la nostra label.<br>label=gtk_label_new (&#8220;Ciao Mondo&#8221;);<br>\/\/Facciamo in modo che non si possa selezionare il testo.<br>gtk_label_set_selectable (GTK_LABEL (label), FALSE);<br>\/\/Aggiungiamo al nostro container (nel caso la nostra finestra) il tasto.<br>gtk_container_add (GTK_CONTAINER (window), label);<br>Ed ecco la nostra window con una bella label con la mitica frase \u201cCiao Mondo\u201d (Figura 2):<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" src=\"http:\/\/www.forlex.it\/wp-content\/uploads\/2019\/11\/gtk\/gtk-part2-win-2.jpg\" alt=\"\" class=\"wp-image-296\" width=\"237\" height=\"154\" srcset=\"http:\/\/www.forlex.it\/wp-content\/uploads\/2019\/11\/gtk\/gtk-part2-win-2.jpg 208w, http:\/\/www.forlex.it\/wp-content\/uploads\/2019\/11\/gtk\/gtk-part2-win-2-100x65.jpg 100w, http:\/\/www.forlex.it\/wp-content\/uploads\/2019\/11\/gtk\/gtk-part2-win-2-150x97.jpg 150w, http:\/\/www.forlex.it\/wp-content\/uploads\/2019\/11\/gtk\/gtk-part2-win-2-200x130.jpg 200w\" sizes=\"(max-width: 237px) 100vw, 237px\" \/><\/figure>\n\n\n\n<p>Sicuramente a qualcuno vorr\u00e0 provare a mettere sulla stessa window la label e il button utilizzando il comando gtk_container_add ma si accorger\u00e0 subito dalla compilazione che non potr\u00e0 farlo!!! Il perch\u00e8? Perch\u00e8 prima di aggiungere al container window i nostri widget (label e button) dovremo definire un layout sul quale inserirli. Quindi nella terza parte spiegheremo i principali layout messi a disposizione da GTK+!!! \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nella prima parte abbiamo creato la nostra prima finestra in Gtk+, adesso cercheremo di aggiungere alla nostra finestra tutti i controlli necessari per&nbsp; interfacciarsi al meglio con l&#8217;utente finale. Il widget button (e relativo segnale) Per prima cosa aggiungiamo alla &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"http:\/\/www.forlex.it\/index.php\/2019\/11\/03\/interfacce-grafiche-per-i-nostri-programmi-in-gtk-parte-2\/\"> <span class=\"screen-reader-text\">Interfacce grafiche per i nostri programmi in GTK+ &#8211; parte 2 &#8211;<\/span> Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/posts\/356"}],"collection":[{"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/comments?post=356"}],"version-history":[{"count":2,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/posts\/356\/revisions"}],"predecessor-version":[{"id":448,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/posts\/356\/revisions\/448"}],"wp:attachment":[{"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/media?parent=356"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/categories?post=356"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/tags?post=356"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}