Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

GTK+ - Úvod ● ● Multiplatformní toolkit pro tvorbu GUI, nabýzí komplexní sadu widgetů pro projekty libovolné velikosti ● Free software,

Podobné prezentace


Prezentace na téma: "GTK+ - Úvod ● ● Multiplatformní toolkit pro tvorbu GUI, nabýzí komplexní sadu widgetů pro projekty libovolné velikosti ● Free software,"— Transkript prezentace:

1 GTK+ - Úvod ● http://www.gtk.org ● Multiplatformní toolkit pro tvorbu GUI, nabýzí komplexní sadu widgetů pro projekty libovolné velikosti ● Free software, součást GNU Projektu ● GTK (Gimp Toolkit) – původně vyvinut pro GIMP (GNU image manipulator), stal se samostatným projektem ● OO API napsané kompletně v C

2 GTK+ - Úvod ● Nad knihovnami – GDK (GIMP Drawing Kit) – low level knihovna pro přístup k funkcím okeního systému na kterém běží – GDK-PIXBUF – knihovna pro manipulaci s rastrovými obrázky na straně klienta – GLIB – náhrada za libc, typový systém, základní datové struktury – PANGO – knihovna pro internacionalizaci textového výstupu ● Bindings – C++ (GTK--), Guile, Perl, Python, TOM, Ada 95, Objective C, Free Pascal, Eiffel, Java, C# ● Glade – nástroj pro grafický návrh částí GUI, generuje kostru programu

3 GTK+ - Základní pojmy ● widget – prvek uživatelského rozhraní (např. button, textový řádek...) – v programu je reprezentován objektem třídy GtkWidget nebo z ní odvozené třídy ● objekt – instance třídy GObject (kořen hierarchie tříd v GTK) nebo nějaké odvozené třídy (widget je speciální případ) ● okno (GTK+) – widget GtkWindow pro top level okno (hlavní okno programu, dialog, popup) ● okno (X/GDK) – zdroj X serveru, zobrazující widget na obrzovce a přijímající události; každý widget může mít jedno nebo více X oken nebo používat okno rodiče

4 GTK+ - První příklad #include int main( int argc, char *argv[] ) { GtkWidget *window; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_show (window); gtk_main (); return 0; } gcc base.c -o base `pkg-config --cflags --libs gtk+-2.0` Překlad:

5 GTK+ - První příklad ● gtk_init (&args, &argv) – inicializuje základní systémové zdroje – volá gdk_init (...) která inicializuje základní zdroje knihovny a parsuje parametry příkazového řádku (např. --display, --sync, --gtk-debug...) ● window = gtk_window_new (GTK_WINDOW_TOPLEVEL) – vytvoří nové okno – GTK_WINDOW_TOPLEVEL – okno vytvářené window managerem – defaultní rozměr je 200x200 pixelů ● gtk_widget_show (window) – zobrazí okno (předpokládá že všechny potřebné atributy jsou nastaveny) ● gtk_main () – hlavní loop GTK, který řídí obsluhu eventů ● pkg-config – skript který vrací potřebné parametry pro překlad (--cflags, --libs...)

6 GTK+ - Hello World #include static void hello( GtkWidget *widget, gpointer data ) { g_print ("Hello World\n"); } static gboolean delete_event( GtkWidget *widget, GdkEvent *event, gpointer data ) { g_print ("delete event occurred\n"); return TRUE; } static void destroy( GtkWidget *widget, gpointer data ) { gtk_main_quit (); } int main( int argc, char *argv[] ) { GtkWidget *window; GtkWidget *button; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL); gtk_container_set_border_width (GTK_CONTAINER (window), 10); button = gtk_button_new_with_label ("Hello World"); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (hello), NULL); g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), G_OBJECT (window)); gtk_container_add (GTK_CONTAINER (window), button); gtk_widget_show (button); gtk_widget_show (window); gtk_main (); return 0; }

7 GTK+ - Signály&Handlery ● Event based programming je v GTK realizovano pomocí signálů, událostí a jejich handlerů ● Pokud nastane událost je emitován signál o nastalé události danou widgetou ● gulong g_signal_connect (gpointer* object, const gchar* sig_name, GCallback cb_func, gpointer cb_data) – umožní připojit handler signálu sig_name k objektu object který ho emituje – cb_func – obslužná funkce handleru, cb_data – data která chci obslužné fci handleru předat ● void cb_func (GtkWidget* widget,..., gpointer cb_data) ● gulong g_signal_connect_swapped (gpointer* object, const gchar* sig_name, GCallback cb_func, gpointer cb_data) – prohodí parametry object a cb_data při volání cb_func – používá se především pro volání GTK+ funkcí jako handlerů

8 GTK+ - Události&Handlery ● Speciální sada událostí, která odpovídá X událostem – event, button_press_event, button_release_event, delete_event, destroy_event, focus_in_event, focus_out_event... – handlery signálů těchto událostí mají speciální sintaxi – gint cb_func (GtkWidget* widget, GdkEvent* event, gpointer cb_data) ● GdkEvent – C union, struktura závisí na dané události ● vrací TRUE když událost obsloužila a nemá být dále propagována widgetům předků ● vrací FALSE pokud se má událost propagovat dále

9 GTK+ - Hello World ● static void hello (GtkWidget* widget, gpointer cb_data) – callback funkce která je volána při stisknutí butonu ● static gboolean delete_event (GtkWidget* widget, GdkEvent* event, gpointer cb_data) – callback funkce, která je volána při volání události “delet_event” (Xová událost) musíme mít speciální handler – vracíme TRUE událost již není dále zpracována ● static void destroy (GtkWidget* widget, gpointer cb_data) – callback funkce která ukončí aplikaci pomocí volání gtk_main_quit () – k widgetu window připojujeme handlery dvou signálů – “delete_event” je emitován když chceme po window manageru zrušit okno nebo pokud je voláno gtk_destroy_widget (...) – “destroy” je emitováno pokud delete_event vrátí FALSE – G_OBJECT, G_CALLBACK jsou makra pro správné přetypování g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL); g_signal_connect (G_OBJECT (window), "destroy",G_CALLBACK (destroy), NULL);

10 GTK+ - Hello World ● gtk_container_set_border_width (GTK_CONTAINER (window), 10) – nastavý atribut contajner objektu – okraj o velikosti 10 pixelů – GTK_CONTAINER makro pro správné přetypování ● button = gtk_button_new_with_label (“Hello World”) – vytvoří nový buton s nápisem “Hello World” – vytvoří strukturu GtkWidget a správně ji nastaví ● g_signal_connect (G_OBJECT (button), “clicked”, G_CALLBACK (hello), NULL) – nainstaluje handler signálu “clicked” (buton je zmáčknut) – vypíše Hello Word ● g_signal_connect_swapped (G_OBJECT (button), “clicked”, G_CALLBACK (gtk_widget_destroy), G_OBJECT (window)) – naistaluje další handler zmáčknutí butonku, který způsobí ukončení aplikace – příklad použití g_signal_connect_swapped, který přehodí parametry do gtk_widget_destroy (...)

11 GTK+ - Hello World ● gtk_container_add (GTK_CONTAINER (window), button) – button bude umístěn do okna (kontajneru) window ● gtk_widget_show (button); gtk_widget_show (window) – zobraz buton v okně

12 GTK+ - Handlery Signálů podruhé ● Návratová hodnota g_connect_signal je gulong. Ta přiřazuje handleru (callback funkci) jednoznačné ID. ● void g_signal_handler_disconnect (gpointer object, gulong id) – odstraní handler jehož ID je id ● void g_signal_handler_block (gpointer object, gulong id) – pozastaví provádění handleru signálu ● void g_signal_handler_unblock (gpointer object, gulong id) – povolí provádění handleru

13 GTK+ - Hello World Advanced ● Juk na zdrojáky v jiném okně


Stáhnout ppt "GTK+ - Úvod ● ● Multiplatformní toolkit pro tvorbu GUI, nabýzí komplexní sadu widgetů pro projekty libovolné velikosti ● Free software,"

Podobné prezentace


Reklamy Google