Tvorba uživatelských rozhraní Knihovny pro tvorbu GUI Jozef Mlích – Department of Computer Graphics and Multimedia Faculty of Information Technology, Brno University of Technology Božetěchova 2, Brno, Czech Republic
ITU: Knihovny pro tvorbu GUI | 2 Agenda wxWidgets GTK Qt
ITU: Knihovny pro tvorbu GUI | 3 wxWidgets – features Cross-platform ability Open source Documentation and samples Wide range of control and window classes Powerful event system Printing facilities Debugging facilities Compiler support Database functionality Document/view classes Drag and drop Easy UI update Configuration files Multithreading Network programming HTML classes OpenGL integration Diagramming application support OLE automation support Multiple language support A user community
ITU: Knihovny pro tvorbu GUI | 4 wxWidgets Julian Smart, University of Edinburgh – první uvolněná verze multiplatformní framework pro návrh GUI – Windows, Linux, *NIX, MacOS využívatí nativního vzhledu systému návrh vychází z MFC – vše se chová jako třída různé porty a binding do rozličných jazyků – wxPython, wxPerl, wxX11, wxGTK… vývojové prostředí pod MS Windows – wxDevCpp
ITU: Knihovny pro tvorbu GUI | 5 wxWidgets – nasazení Audacity AVG Code::Blocks RapidSVN Jedno z GUI pro VLC BitTorrent Filezilla
ITU: Knihovny pro tvorbu GUI | 6 wxWidgets – hierarchie tříd
ITU: Knihovny pro tvorbu GUI | 7 wxWidgets třídy na nižší úrovni pro nevizuální objekty – wxHashMap, wxString, wxList, wxPathList a mnohé další podpora RTTI – meta-informace o třídách (wxClassInfo) vnitřní počítání referencí některých objektů podpora unicode (závisí na parametrech při kompilaci samotné knihovny) – makro wxT pro převod znaků do správné vnitřní reprezentace RichText editační prvky, regulární výrazy, apod.
ITU: Knihovny pro tvorbu GUI | 8 wxWidgets možnost lokalizace aplikací pomocí makra _T() nebo _() – podpora pro hypertextovou nápovědu –.HLP soubory (wxHelpController) tvorba vícevláknových aplikací – wxThread, wxMutex, wxCriticalSection, wxCondition síťové aplikace – sockety, http/ftp, wxURL zobrazení základního HTML – wxHTML podpora pro připojení k databázi – wxDb, wxODBC...
ITU: Knihovny pro tvorbu GUI | 9 wxWidgets – wxString efektivní, optimalizované použití, podpora unicode, velké množství dostupných metod (AfterFirst, BeforeLast, operator<< popř. Printf, Format...) – wxString str1(”test1”); – wxString str2(”test2”); – wxString str3(” ”); str1.Upper(); // převod řetězce na velké znaky str1.Cmp(str2); // porovnání dvou řetězců (case sensitive) str1.Freq(”e”); // počet znaků 'e' v řetězci str3.ToDouble(&dbl); // převod řetězce na číslo str.Trim(); odstranění přebytečných bílých znaků wxString::Format(wxT(”%s=%d\n”), str1.c_str(), dbl);
ITU: Knihovny pro tvorbu GUI | 10 wxWidgets – pozicování vlastní XML resource soubory (XRC) – značkovací jazyk pro definici uživatelského rozhraní layout systém rozložení prvků – nevyužívá se fixního rozložení, ale tzv. Sizers uživatelské rozhraní mění své rozložení a velikost prvků podle předem specifikovaných podmínek – snadné přizpůsobení nastavení uživatele více typů rozložení, podle použitého typu kontejneru - wxGridSizer, wxBoxSizer a další možnost uložení návrhu GUI do speciálního souboru zdrojů
ITU: Knihovny pro tvorbu GUI | 11 wxWidgets – příklad Co vidíme – události – _T() – layouty
ITU: Knihovny pro tvorbu GUI | 12 GTK Stability Cross Platform Language Bindings Mobile Accommodating Interfaces – Buttons, menus, combo boxes, layouts, trees, lists Foundations – Main loop, thread support, dynamic loading modules, lists, arrays, lexical scanner, base64
ITU: Knihovny pro tvorbu GUI | 13 GTK – nasazení Gnome Inkscape GIMP (The Gimp Toolkit == GTK) Firefox Pidgin
ITU: Knihovny pro tvorbu GUI | 14 GTK – struktura GLib - pomocné funkce a datové struktury GDK - wrapper funkcí Xlib, popř. jiného grafického systému GObject - generický typový a objektový systém, signály GTK+ - jádro toolkitu GTK+ a definice widgetů Pango - zobrazování textu ATK - Accessibility Toolkit, zpřístupnění pro postižené
ITU: Knihovny pro tvorbu GUI | 15 GTK Aplikace je tvořena stromem instancí objektů a běh je zajištěn doručováním událostí do odpovídajících objektů. aplikace obsahuje: – inicializaci knihovny, – sestavení stromu instancí objektů, – registraci akčních funkcí, – realizace a mapování – nastartování aplikační smyčky inicializace aplikace – gtk_init(argc, argv);
ITU: Knihovny pro tvorbu GUI | 16 GTK vytváření objektů – knihovna zavádí pojem grafický objekt (widget) – chování a styl objektu je definováno třídou objektu – kód třídy objektu autonomně zpracovává většinu operací – grafický objekt je identifikován datovým typem GtkWidget – pro každou třídu je definována funkce pro vytvoření instance – základem všech grafických objektů je třída GtkWidgetClass
ITU: Knihovny pro tvorbu GUI | 17 GTK kontejnery – instance objektu, do kterého je možné vkládat další objekty a umožňuje např. jejich pozicování – přesná funkce je určena typem kontejneru – gtk_container_add(GTK_CONTAINER(main), button);
ITU: Knihovny pro tvorbu GUI | 18 GTK – vlastnosti objektů pomocí funkcí definováných pro každou třídu – gtk_třída_get_xxx(...);, gtk_třída_set_xxx(...); nebo pomocí obecných funkcí – g_object_get(...);,g_object_set(...); každá třída objektů má v manuálu seznam všech vlastností, typů těchto vlastností a funkcí pro zjišťování a nastavování těchto vlastností gtk_widget_set_name(main, "main"); gtk_container_set_border_width(GTK_CONTAINER(main), 10);
ITU: Knihovny pro tvorbu GUI | 19 GTK – zpětné volání signály (signal) – zpráva vyslaná instancí GtkObject jako reakce na určitý prvek v prostředí události (event) – nepřetržitý tok zpráv ohledně změn prostředí ve spodní vrstvě zobrazovacího systému
ITU: Knihovny pro tvorbu GUI | 20 GTK – zpětné volání registrace je v obou případech stejná – g_signal_connect(G_OBJECT(tlacitko), "clicked", G_CALLBACK(click_action), user_value); – proměnná typu GtkWidget – jméno signálu v řetězcové podobě – adresa funkce odpovídajícího typu – přetypování G_CALLBACK() – uživatelská hodnota přetypovaná na gpointer funkce pro signál – void click_action(GtkWidget *widget, gpointer user_data); funkce pro událost – void delete_action(GtkWidget *widget, GdkEvent *event, gpointer user_data);
ITU: Knihovny pro tvorbu GUI | 21 GTK – podmínky pro zobrazení widgetu realizace a mapování – gtk_widget_show(...); – gtk_widget_show_all(...); – gtk_widget_hide(...); správa – po vytvoření jsou objekty vloženy nikam, jsou tedy nespravované, – po vložení do kontejneru se stanou spravovanými – gtk_widget_show(button); – gtk_widget_show(main); nastartování aplikační smyčky – hlavní cyklus je skryt ve funkci – gtk_main();
ITU: Knihovny pro tvorbu GUI | 22 GTK – glade podpora tvorby GUI – skeleton vytvářené aplikace, do kterého se pouze doplní akční kód – nebo XML soubor, který obsahuje definici uživatelského rozhraní Nyní je preferována pouze druhá výše zmíněná možnost – GUI se nahraje z XML soubor za běhu aplikace pomocí knihovny libglade
ITU: Knihovny pro tvorbu GUI | 23 Qt Intuitive C++ class library Portability across desktop and embedded operating systems Integrated development tools with cross-platform IDE High runtime performance and small footprint on embedded
ITU: Knihovny pro tvorbu GUI | 24 Qt – nasazení KDE ( + KOffice) Google Earth VLC VariCAD Skype (linux) Amarok 2
ITU: Knihovny pro tvorbu GUI | 25 Qt – nástroje Qt Designer – Vytváření gui Qt Assistant – dokumentace Qt Linguist – Lokalizace qmake – makefile
ITU: Knihovny pro tvorbu GUI | 26 Qt – součásti core (included by default)QtCore module gui (included by default)QtGui module networkQtNetwork module openglQtOpenGL module phononPhonon Multimedia Framework sqlQtSql module svgQtSvg module xmlQtXml module webkitWebKit integration qt3supportQt3Support module (.pro “QT += xml”, apod. )
ITU: Knihovny pro tvorbu GUI | 27 Qt – MOC Meta Object Compiler rozšíření C++ pro snadnější tvorbu GUI na bázi makro jazyka – Nuný preprocessing – meta object compiler (moc) třída QObject – základní třída všech objektů v Qt makro Q_OBJECT – deklarace v privátní části třídy; umožňuje použití – dynamické vlastnosti objektů – signálů a slotů (viz dále) – doporučeno použití u všech tříd odvozených od Qobject. klíčová slova ve standardním C++ kódu
ITU: Knihovny pro tvorbu GUI | 28 Qt – Qobject Organizace objektů do stromu – rodiče objektu lze určit při jeho konstrukci; při destrukci objektu jsou automaticky uvolněny i všichni potomci Podpora pro reflexi – možnost získat meta objekt (QMetaObject) popisující daný QObject => lze zkoumat dědičnost, vlastnosti objektů apod. Přijímání a filtrace událostí – události zaslány vláknu, kde byl objekt vytvořen Základní podpora pro časovače – po spuštění (startTimer(interval)) je periodicky volána metoda timerEvent(QTimerEvent *event) Dynamické vlastnosti Mechanismus signálů a slotů
ITU: Knihovny pro tvorbu GUI | 29 Qt – signály a sloty komunikace mezi objekty náhrada callbacků; typově bezpečné ovšem pomalejší Signál je emitován při definované události Slot je metoda volaná jako reakce na zachycený signál propojení:
ITU: Knihovny pro tvorbu GUI | 30 Qt – demo Překlad Generování GUI Lokalizace a funkce tr() Signaly a Sloty Layouty
ITU: Knihovny pro tvorbu GUI | 31 Poděkování plus/ Smart J., Hock K., Csomor S.: Cross-Platform GUI Programming with wxWidgets. 2005, ISBN , 744 pages.