Guida Gtk+ a puntate ( X parte )
Eccoci ritrovati alla decima puntata, e manca ancora tanto tanto.. ma pian pianino ce la faremo. Come avevo promesso in questa puntata ci occupiamo delle tabelle.
Aprite il vostro editor e compilatore, preparate il vostro quadernetto con gli appunti che iniziamo!
Tabelle
Una tabella penso sappiate tutti cosa sia, un riquadro composto da un tot di righe e un tot di colonne. Questo tipo di contenitore è molto comodo nel caso si debbano allineare molti widget senza stare ad impazzire con 1000 box, ad esempio se si sta scrivendo una calcolatrice.
Bene l’utilizzo è molto semplice, non vi mostro la funzione “easy” per aggiungere i vari widget perché la maggiorparte delle volte crea solo obbrobri.. vi mostro invece la procedura con la funzione relativamente difficile che vi consiglio di usarel’80% delle volte.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window, *table, *button; int rows, cols; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Ciao Tabelle!"); gtk_container_set_border_width (GTK_CONTAINER (window), 3); table = gtk_table_new (4, 3, TRUE); gtk_container_add (GTK_CONTAINER (window), table); for ( rows = 0; rows < 4; rows++ ) { for ( cols = 0; cols < 3; cols++ ) { button = gtk_button_new_from_stock (GTK_STOCK_CLOSE); gtk_table_attach (GTK_TABLE (table), button, cols, cols + 1, rows, rows + 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (gtk_main_quit), NULL); } } gtk_widget_show_all (window); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), NULL); gtk_main (); return 0; } |
Con questo codice abbiamo la seguente tabella:
Ok iniziamo a spiegare i vari punti:
1 | table = gtk_table_new (4, 3, TRUE); |
Con questa funzione si crea una nuova tabella, i parametri sono in ordine: il numero di righe, il numero di colonne, se riservare a tutte le celle lo stesso spazio.
1 2 3 | gtk_table_attach (GTK_TABLE (table), button, cols, cols + 1, rows, rows + 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); |
Questa era la funzione difficile di cui vi parlavo, quello che fa paura è il numero di parametri.. ma andiamo a vederli nello specifico
- La tabella in cui inserire il widget
- Il widget da inserire
- Posizione della colonna di partenza
- Posizione della colonna finale
- Posizione della riga di partenza
- Posizione della riga finale
- Attributi dell’ancoraggio orizzontale
- Attributi dell’ancoraggio verticale
- Padding ( Ovvero spazio in pixel ) aggiuntivo da riservare orizzontalmente
- Padding aggiuntivo da riservare verticalmente
Ok, scommetto che non vi sono chiari i punti dal 3 al 6 se vi sono chiari pazienza, spiego ugualmente.
Dovete immaginarvi la tabella in questo modo:

Il widget iniziale quindi partirà dalla colonna\riga 0 e finirà alla colonna\riga 1 indi x(0,1)\y(0,1), il secondo widget x(1,2)\y(0,1) e così via..
Ora ritornando ai parametri che richiede la funzione gtk_table_attach mi soffermerei due secondi sui punti 7 e 8. ovvero sugli attributi che possono essere dati. Bene gli attributi possono essere usati contemporaneamente unendoli tramite OR ( | ) e sono:
- GTK_FILL: Fa in modo che il widget sia “incollato” alla colonna precedente
- GTK_EXPAND: Dà la possibilità al widget di espandersi adattandosi alle dimensioni della cella.
- GTK_SHRINK: Richiede al widget di occupare il minor posto possibile all’interno della cella.
Abbiamo concluso con le tabelle, l’ultima cosa da sapere è che si può settare uno spazio di default tra le varie celle tramite le funzioni: gtk_table_set_row_spacings e gtk_table_set_col_spacings dando come primo parametro la tabella e come secondo lo spazio in pixel che si vuole impostare alle varie righe o colonne.
Fine Decima Puntata
OOooooook, vi aspetto nella prossima puntata così concludiamo veramente e definitivamente l’argomento Contenitori, e passiamo a cosa più stimolanti come i pulsanti!
Ciauz
wow questa l’ho capita tutta…..^.^