Guida Gtk+ a puntate ( V parte )
Abbiamo raggiunto la quinta puntata! Anvedi! Bene, non perdiamo tempo, la strada è ancora lunga e anche se probabilmente qualcuno avrò iniziato a fare i suoi primi programmini graficosi ci sono un sacco di cose da sapere per sviluppare come si deve in Gtk+.
Ora ci occupiamo delle varie finestre anche perché senza di esse non si va da nessuna parte.
Ready? GO!
Dialoghi
Un dialogo è simile ad una finestra, che vedremo tra poco, viene usato principalmente per il riporto di piccoli messaggi o la richiesta di input semplici. Essendo del tipo finestra può essere utilizzato con la macro GTK_CONTAINER, GTK_WINDOW e GTK_DIALOG godendo di tutte le funzioni relative ad ognuno di questi tipi. Ci son due modi per creare un Dialogo, il primo lo si usa quando si vuole settare da 0 tutto come con una finestra e lo si fa tramite:
1 2 3 | GtkWidget *dialog; dialog = gtk_dialog_new (); |
L’altro metodo invece permette di avere una finestra di dialogo già pronta, come quando ad esempio bisogna visualizzare una finestra di errore, di info o quando bisogna proporre una scelta a cui si può rispondere si o no..
Il metodo è il seguente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | GtkWidget *dialog, *dialog_area, *label; dialog = gtk_dialog_new_with_buttons ("Titolo dialogo", finestra_principale, GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); dialog_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); label = gtk_label_new ("Testo all'interno del dialogo"); gtk_container_add (GTK_CONTAINER (dialog_area), label); gtk_dialog_run (GTK_DIALOG(dialog)); |
Dunque esaminando meglio i parametri vediamo che al primo posto è il titolo del dialogo ( o NULL se si vuole utilizzare il titolo di default delle finestre gtk ), come secondo parametro la finestra principale ( o NULL se non è presente ), come terzo i Flags del dialogo che possono essere:
- GTK_DIALOG_MODAL
- GTK_DIALOG_DESTROY_WITH_PARENT
- GTK_DIALOG_NO_SEPARATOR
La prima forza il controllo sul dialogo e quindi non permette di usare la finestra principale, la seconda fa sì che una volta chiuso il dialogo si chiuda anche la finestra a cui è collegata e infine l’ultima non inserisce una linea separatrisce tra il contenuto del dialogo ed eventuali bottoni inseriti.
Continuando gli argomenti dal quarto posto in poi sono facoltativi e finisce di aspettarsi argomenti quando trova il parametro NULL. I parametri facoltativi vanno di due in due, ovvero: STOCK_BUTTON – VALORE_DI_RITORNO. Nel nostro caso abbiamo il pulsante OK che ritorna il valore GTK_RESPONSE_OK. Il valore del pulsante premuto verrà restituito da dialog_run ( che restituisce un gint ).
Andando avanti nella creazione di questo dialogo, vediamo la funzione gtk_dialog_get_content che restituisce un GtkContainer sotto forma di GtkWidget dove poter inserire il contenuto del dialogo, nel nostro caso abbiamo inserito un semplicissimo label. Questo caso non l’ho fatto casualmente ma per un motivo ben preciso ovvero il poter introdurre il tipo GtkMessageDialog.
Esso altro non è che un’astrazione di GtkDialog fatta appositamente per creare dialoghi che riportano messaggi. Il suo prototipo è:
1 2 3 4 5 6 | GtkWidget* gtk_message_dialog_new (GtkWindow *parent, GtkDialogFlags flags, GtkMessageType type, GtkButtonsType buttons, const gchar *message_format, ...); |
Il primo parametro è la classica finestra principale, il secondo sono i flag del dialogo ( quei tre descritti poco fa ), il terzo il tipo di messaggio che può essere uno di questi:
- GTK_MESSAGE_INFO → Messaggio di informazione
- GTK_MESSAGE_WARNING → Messaggio di errore non fatale
- GTK_MESSAGE_QUESTION → Messaggio di domanda
- GTK_MESSAGE_ERROR → Messaggio di errore fatale
- GTK_MESSAGE_OTHER → Messaggio generico
Dopodichè ci sono i bottoni da visualizzare e abbiamo le seguenti scelte:
- GTK_BUTTONS_NONE → Nessun Pulsante
- GTK_BUTTONS_OK → Visualizza il pulsante OK
- GTK_BUTTONS_CLOSE → Visualizza il pulsante CHIUDI
- GTK_BUTTONS_CANCEL → Visualizza il pulsante ANNULLA
- GTK_BUTTONS_YES_NO → Visualizza i pulsanti SI E NO
- GTK_BUTTONS_OK_CANCEL → Visualizza i pulsanti OK e ANNULLA
Infine abbiamo la stringa del messaggio in modalità printf-like, quindi come quinto argomento potremmo scrivere qualcosa come “Ciao %s, sei sicuro di avere %d anni?”, nome, anni.
Se si vuole utilizzare il markup di pango c’è la funzione gtk_message_dialog_new_with_markup che riceve gli stessi parametri di gtk_message_dialog_new solo che converte ad esempio un testo “<b>ciao</b>” in grassetto.
Per finire, ricordo che i flags dei dialoghi possono essere uniti tramite l’operatore di unione bit-a-bit |.
Fine Quinta Puntata
E lo so, finisce troppo presto.. purtroppo non sono tipo da monologhi e pagine interminabili.
Comunque nella prossima puntata vedremo le finestre intese come GtkWindow promesso.
fai una puntata dedicata ai menu ?
Grazie
uhm.. finita la textview ci posso pensare, ma non è semplice come argomento
Ciao, mi sapresti dire a cosa serve l’ultimo parametro che si passa alla funzione g_signal_connect?
Ho letto nel tuo articolo che è un puntatore void, ma non ne capisco l’utilità. Perchè spesso si passa il valore NULL? Grazie
viene utilizzato per eventuali parametri passati alla funzione collegata.
Per ricevere il parametro passato la funzione generica che permette di prenderlo è strutturata in questo modo:
può anche avere definizioni diverse dipendentemente dal widget a cui si è collegato il segnale, ma questa struttura è quella generica che va bene per tutti