Domande frequenti (FAQ)

1. Il posto di gtkmm nel mondo

Che cos'è GTK?

GTK è il toolkit di widget GUI, scritto in C, che funge da fondamento per il progetto GNOME e per molte applicazioni stand-alone. GTK è la base su cui è costruito gtkmm. Consultare https://www.gtk.org.

Perché si chiama gtkmm?

gtkmm era originariamente chiamato gtk-- perché GTK si chiamava originariamente GTK+ e aveva un + nel nome. Tuttavia, poiché -- non è facilmente indicizzabile dai motori di ricerca, il pacchetto ha assunto generalmente il nome gtkmm, e questo è il nome che abbiamo mantenuto.

Perché usare gtkmm invece di GTK?

  • gtkmm vi consente di scrivere codice usando le normali tecniche C++, come incapsulamento, derivazione e polimorfismo. Come programmatori C++, probabilmente già saprete che ciò porta a un codice più chiaro e meglio organizzato.
  • gtkmm è più tipo-sicuro (type-safe), quindi il compilatore può rilevare errori che verrebbero individuati, usando C, solo durante l'esecuzione. Questo uso di tipi specifici rende anche l'API più chiara, perché si può vedere quali tipi dovrebbero essere usati semplicemente guardando la dichiarazione di un metodo.
  • L'ereditarietà può essere usata per derivare nuovi widget. La derivazione di nuovi widget nel codice C di GTK è così complicata e soggetta a errori che quasi nessun programmatore C la usa nella prat. È noto ai programmatori in C++ che la derivazione è una tecnica fondamentale della programmazione orientata agli oggetti.
  • Possono essere usate istanze di membri, semplificando la gestione della memoria. Tutti i widget C di GTK vengono gestiti tramite puntatori. In C++ è una buona pratica evitare di usare puntatori, ove possibile.
  • Meno codice. Il modello a oggetti C di GTK usa nomi di funzione con prefisso e macro di cast. Ad esempio: gtk_button_set_text(GTK_BUTTON(button), "sometext"); il codice C++ di gtkmm è più breve e chiaro. Ad esempio: button.set_text("sometext");
  • Non c'è bisogno di preoccuparsi della politica di conteggio dei riferimenti (reference-counting) di GTK.

Perché usare libsigc++? Perché non usare le funzioni di segnale di GTK?

  • I segnali GTK non sono tipo-sicuri (typesafe). Il compilatore non può dirvi se la vostra callback ha il numero o il tipo errato di argomenti o valore di ritorno.
  • Possono essere usati solo con funzioni o metodi statici. Con libsigc++ le callback possono anche essere metodi d'istanza, usando i dati membri di un particolare oggetto. Possono anche essere metodi virtuali, che possono essere sovrascritti in una classe derivata.

Perché GTK e GNOME stessi non sono scritti in C++?

  • Il C è un linguaggio più semplice, quindi più persone lo conoscono, specialmente su Unix.
  • Il C può essere avvolto (wrapped) da qualsiasi altro linguaggio, rendendo l'API disponibile a più sviluppatori.
  • GTK e GNOME hanno un codice C molto ben organizzato, molto più sensato della maggior parte del codice C che si incontra in giro. Ciò è in parte dovuto alla sua struttura orientata agli oggetti basata su C.

Perché non usate Qt, se vi piace così tanto il C++?

Gli sviluppatori di gtkmm tendono a preferire gtkmm rispetto a Qt perché gtkmm è più conforme al C++. Qt ha origine in un'epoca in cui il C++ e la libreria standard non erano standardizzati o ben supportati dai compilatori. Pertanto, duplica molte cose che ora si trovano nella libreria standard, come i contenitori e le informazioni sui tipi. Un aspetto più significativo: hanno modificato il linguaggio C++ per fornire i segnali, cosicché le classi Qt non possono essere usate facilmente con classi non di Qt. gtkmm è stato in grado di usare il C++ standard per fornire i segnali senza cambiare il linguaggio C++.

Inoltre, gtkmm e gli altri moduli *mm permettono di creare software che lavora più a stretto contatto con l'ambiente desktop GNOME.

2. Quanto è valido gtkmm?

Su quali sistemi gira?

gtkmm dovrebbe girare su qualsiasi sistema di tipo UNIX con i compilatori e le librerie corretti installati. Il compilatore GNU C++ (g++, parte di gcc) insieme al toolset GNU (come quello che si trova sui sistemi Linux e *BSD) costituiscono il suo ambiente di compilazione predefinito. Può anche essere compilato e usato su Windows con gli strumenti di compilazione mingw o MSVC.

Quanto è completo?

gtkmm cerca di offrire tutte le funzionalità offerte da GTK. Ciò significa che con gtkmm dovrebbe essere possibile fare tutto ciò che è supportato da GTK, e farlo più facilmente. Se qualcosa non è coperto, vorremmo saperlo.

GLib contiene classi con funzionalità simili alle classi C++ standard, ad esempio GThread e GTree. Tali classi GLib non sono avvolte (wrapped) in glibmm.

gtkmm usa i contenitori C++ standard come std::string e std::vector?

Sì, crediamo nel riutilizzo del codice C++ standard ovunque possibile. Questo potrebbe non essere ovvio all'inizio, perché gtkmm ha Glib::ustring che ha quasi la stessa interfaccia di std::string. Glib::ustring esiste perché lo standard C++ non supporta bene le stringhe codificate in UTF8.

Come si confronta gtkmm con Qt?

  • gtkmm usa C++ puro. Qt richiede estensioni al C++ che vengono analizzate dal pre-processore moc.
  • gtkmm usa std::string, std::vector, iteratori, ecc. Qt ha i propri contenitori specifici.
  • Con gtkmm si può usare la normale gestione della memoria C++. Qt esige che tutti i widget siano gestiti come puntatori e che la loro eliminazione sia delegata ai widget genitori.
  • La disposizione dei widget sembra essere più facile in gtkmm. In Qt, contenitori e layout sono classi separate e i widget figli devono essere aggiunti a entrambi.
  • L'API di gtkmm tende a essere più esplicita. Il comportamento delle classi Qt dipende spesso dagli effetti impliciti dei costruttori sovrascritti.

3. Ulteriori informazioni

Dove si può discutere di gtkmm?

Consultare la pagina Discussione.

Quale documentazione esiste per gtkmm?

Consultare la pagina Documentazione.

Dove posso trovare del codice d'esempio?

Consultare la directory degli esempi nel modulo gtkmm-documentation. La maggior parte di essi appare nel libro di gtkmm.

4. Usare gtkmm

Quali argomenti del compilatore si dovrebbero usare per compilare un programma gtkmm?

Consultare la documentazione di riferimento.

Come ottenere l'oggetto GTK da un oggetto gtkmm?

Se si ha bisogno di alcune funzionalità GTK non supportate tramite gtkmm, è possibile chiamare il metodo gobj() nella classe pertinente, che restituirà un puntatore all'oggetto GTK in C semplice. Si può quindi operare direttamente su questo oggetto C come si farebbe in un qualsiasi programma GTK.

Come avvolgere (wrap) un widget GTK in un'istanza gtkmm?

Glib::wrap() fornirà un puntatore a un oggetto gtkmm. Si tratta di una funzione in overload, che quindi fornirà un'istanza della classe appropriata.

Posso usare le eccezioni C++ con gtkmm?

Sì, ma ci sono delle restrizioni. Poiché il C semplice non sa cosa sia un'eccezione C++, si possono usare le eccezioni nel proprio codice gtkmm a patto che non ci siano funzioni C nello stack delle chiamate tra chi lancia l'eccezione (thrower) e chi la intercetta (catcher). Ciò significa che bisogna catturare l'eccezione localmente.

Si verrà avvertiti sulle eccezioni non catturate durante l'esecuzione, e per tali eccezioni si potrà specificare un gestore diverso. Alcuni metodi di gtkmm usano le eccezioni per segnalare errori. I tipi di eccezione che potrebbero essere lanciati sono elencati nella documentazione di riferimento di tali metodi.

Come usare Cambalache o Glade con gtkmm?

Consultare il capitolo Gtk::Builder nel libro di gtkmm. Cambalache sostituisce l'applicazione Glade. Glade non può essere usata con GTK4/gtkmm4.

Cosa fa Gtk::make_managed<T>(args)?

Significa che «il widget contenitore eliminerà questo widget figlio». Usarlo se non ci si vuole preoccupare di quando eliminare i widget allocati dinamicamente.

Come imparare a disporre i widget? Le opzioni di impacchettamento (packing) sono complicate.

Cambalache è un ottimo modo per vedere cosa si può fare con i widget GTK e GNOME. Usare Cambalache per esplorare la scelta dei widget e per vedere come possono essere messi insieme.

Sono abituato a MFC (Microsoft Foundation Class Library). Dove sono il Documento e la Vista?

Document/View (che è una versione del pattern di progettazione software Model–View–Controller (MVC)) non è supportato direttamente da GTK. Tuttavia, le classi Gtk::TextView e Gtk::ListView sono suddivise in modello e vista.

Come si caricano le immagini da usare con gtkmm?

Usare Gdk::Pixbuf e/o Gtk::Image. Entrambi sono facili da usare e supportano una vasta gamma di tipi di file immagine.

gtkmm è thread-safe?

Né GTK né gtkmm sono thread-safe. Tutto il codice GUI deve essere eseguito nello stesso thread. Se il proprio programma potrebbe trarre beneficio dall'uso di più thread, consultare il capitolo Programmi multi-thread nel libro di gtkmm.