Tato stránka vyľaduje podporu CSS stylů

Semestrální práce z předmětu 36NUR

GUI nezávislé na platformě

26.5.2003

Oto Válek

FEL ČVUT, letní semestr 2002/2003, cvičení St 16:15

1. Zadání

Cílem je projít dostupné moľnosti pro vytváření multiplatformních uľivatelských rozhraní. Na tato rozhraní jsou kladeny zvýąené nároky, coľ je někdy na úkor user-friendliness. Cílem je porovnat a ohodnotit dostupné knihovny. Součástí práce by měla být testovací aplikace napsaná s pouľitím popisovaných knihoven.

2. Prezentace

Zde je k dispozici prezentace ve formátu HTML.

3. Porovnávané knihovny

Do srovnání bylo zahrnuto ąest knihoven - toolkitů pro uľivatelské rozhraní. Následuje stručné srovnání, které bude rozebráno níľe.
QT GTK wxWindows TCL/TK Java-AWT Java-Swing
Aktuální verze 3.1.2 2.2 2.4.0 8.3 2SE 1.4.1
Odkaz http://www.trolltech.com http://gtk.org http://www.wxwindows.org http://tcl.tk http://java.sun.com
OS - Win32 komerční* ano ano komerční* ano
OS - Unix ano ano ano ano ano
OS - Mac komerční sf.net ano ano ano
OS - daląí BeOS(alpha) OS/390,...
nativní jazyk C++ C C++ Tcl/Tk Java
licence GPL/komerční LGPL LGPL zdarma i pro komerční apl. J2SE SDK i JRE zdarma i pro komerční apl.
 
rozloľení elementů potomci QLayout prvky hbox, vbox wxBoxSizer, wxGridSizer, ... .frame.elem hiearchie & pack LayoutManagery
lokalizace makra s kontetxtem _() & GNU gettext _() & GNU gettext balík ::msgcat java.util.locale, řetězce odděleně
 
řádků test.aplikace 241 476 58 56 100 105
ručně napsaných řádků 102 79 58 56 100 105
velikost dyn. linkovaná 36,6 kB 170,0 kB 76,5 kB 1,7 kB 4,1 kB 4,4 kB
velikost v paměti 9972 kB 2424 kB 6132 kB 2588 kB 18732 kB 21692 kB

3. Qt

Knihovna Qt je komerční produkt firmy Trolltech, který je ve verzi pro Unix/X11 uvolněn pod licencí GPL. Pod Windows lze zdarma vyvíjet jen nekomerční aplikace, jinak je třeba nejméně Professional Edition s cenou od $1550.
Aplikací volné GPL varianty je Linuxové prostředí KDE, komerční verze WWW prohlíľeč Opera.
Knihovna nabízí ąirokou ąkálu prvků včetně poměrně komplikovaných - dialog pro výběr barev nebo hypertextový prohlíľeč kompatibilní s podmnoľinou HTML. Na výběr je také ze ąesti stylů UI imitujících známá UI - Windows, Motif, SGI, atd., které je moľné přepínat za běhu. Díky tomu je moľné vyvinout aplikace s přirozeným vzhledem pod různými OS. Snahou tvůrců je třídami knihovny pokrýt kromě GUI i řadu daląích oblastí, kde se jednotlivé OS liąí - databáze, 3D grafika, ukládání uľivatelského nastavení.
Návrh vlastního kódu je důsledně objektový, vlastní UI objekty se odvozují větąinou z třídy QWidget. Některou funkcionalitu lze doplnit přetíľením metod (reakce na myą a klávesy). Propojení událostí generovaných prvky UI ("signals") s metodami, které je oąetřují ("slots") se řeąí voláním connect() v rámci definice UI, která je programová během konstruktoru objektu.
Při překladu je třeba preprocesor (moc - "meta object compiler"), který vygeneruje pomocný metakód z hlavičkových souborů, kde je za tímto účelem v deklaraci tříd vlastní sekce "slots:". Je tedy třeba speciální makefile, který vąak lze vygenerovat programem qmake.

4. GTK

Knihovna GTK vznikla původně během vývoje grafického editoru GIMP a je základem linuxového desktopového prostředí Gnome. Je ąířena pod benevolentní licencí LGPL, která umoľňuje vyvíjet zdarma i komerční aplikace.
Stejně jako Qt nabízí řadu hotových dialogů a prvků. Koncepce knihovny je ale na vąech platformách unixová, například dialogu pro výběr písem je stavěn pro písma postscriptová. I vzhled aplikace je stále stejný, není nativní, coľ je nápadné zvláątě ve Windows. Editor UI Glade je snadno pouľitelný a generuje zdrojový kód, jehoľ část (callbacks.c) lze dále upravit a opakovaně načíst zpět do Glade.
Pouľití neobjektového jazyka C pro GUI knihovnu není ideální volbou, práce s objekty je řeąena strukturami se shodnými začatky, přetypovávacími makry a funkce mají komplexní jména, obsahující i "třídu" objektu. Proto vznikla řada objektových nástaveb, například GTK-- nebo wxWindows.
Ze srovnávaných knihoven se jedná patrně o nejroząířenějąí. Má také nejniľąí pamě»ové nároky (alespoň v případě testovací aplikace)

5. wxWindows

wxWindows je knihovna málo známá, ale i v tomto prostředí byly vyvinuty známé aplikace, např. AVG Antivirus nebo editor zvuku Audacity. Knihovna negeneruje grafické prvky sama, ale pouľívá interface dostupný na dané platformě (GTK v Linuxu, Win32 API ve Windows). Výhodou je tedy nativní vzhled.
Syntaxe a způsob návrhu vychází z MFC, GUI knihovny Microsoftu. Propojení zdrojů a příjemců událostí je deklarováno pomocí maker ve struktuře EVENT_TABLE, velmi podobné MESSAGE_MAP v MFC. Tedy v podstatě odděleně od kódu metod. Také základní třídy, tvořící View, Document, Dialog mají v MFC své protějąky. Proto je uváděno, ľe převod menąí uľ existující aplikace z MFC je v řádu dnů.
Přestoľe knihovna podporuje automatické rozmístění elementů, z neznámého důvodu pouľívá větąina příkladů s SDK umístění absolutní. Je pouľito i v těchto příkladech:

6. Tcl/Tk

Tcl/Tk, tedy kombinace příkazového jazyka Tcl a grafického toolkitu Tk, slouľí k jinému druhu aplikací. Interpretovaný jazyk a jednoduchá (i kdyľ neobvyklá) syntaxe ji předurčuje k pouľití ve skriptech i k automatickému generování GUI. Takový je případ konfiguračního programu jádra Linuxu (make xconfig), kde je Tcl/Tk pouľito.
Interpretem Tcl/Tk se nazývá wish ("windowing shell") a pracuje v dávkovém i interaktivním reľimu.
Sloľité propojování událostí a jejich oąetření je zde nahrazeno zvláątě elegantním způsobem. Kód spuątěný např. stiskem tlačítka je tu v podobě bloku deklarován přímo jako jeden z parametrů tlačítka. Daląím zjednoduąením je jednotný jmenný prostor (kaľdý prvek je jednoznačně identifikován v hiearchické struktuře - .bottom.left.button1 ), coľ eliminuje nutnost uchovávat ukazatele na vytvořené elementy.

7. Java

Java je od základu multiplatformní jazyk a nabízí dvě GUI, AWT (Abstract Window Toolkit) a Swing.
AWT vyuľívá nativní API platformu, na které běľí. Proto je rychlejąí, ale nabízí jen velmi omezený (z porovnávaných knihoven nejmenąí) rozsah prvků, který je v podstatě průnikem schopnosti vąech OS, kde Java běľí.
Swing je vyspělejąí, vycházející z AWT (prvky obou knihoven lze dokonce kombinovat). Vąechny prvky jsou vykreslovány knihovnou, a tak nabízí jednotný vzhled na vąech platformách včetně nastavitelného stylu ("Look and Feel"). V testovací aplikaci byl pouľit styl Metal. Aktuální verze Swingu podporuje navíc nativní vzhled ve Windows a pod Mac OS X (Aqua).
V současné době ovąem není v oblasti desktopových GUI aplikací Java roząířena, setkal jsem se v podstatě se dvěma větąími aplikacemi - klientem P2P sítě eDonkey a editorem GUI aplikací pod PalmOS. Ani jedno ovąem není komerční placený produkt.

8. Rozmístění elementů

Moľnost rozmístit elementu UI v dialogu/aplikaci nezávisle na rozliąení, velikosti fontů a změně velikosti okna je důleľitá vlastnost platformově nezávislé GUI knihovny. Podporují vąechny knihovny, některé ani absolutní umístění elementů neumoľňují (Java, Tk).
Tato nezávislost na rozliąení je dosaľena u vąech knihoven v zásadě stejným způsobem, hiearchií panelů/framů z nichľ kaľdý dokáľe v sobě podle určitých pravidel rozmístit daląí panely nebo elementy. Tato pravidla mohou být jednoduchá (hbox a vbox v GTK) aľ velmi komplexní (GridBagLayout v Javě), kdy je na umístění jednoho tlačítka třeba několik řádek kódu.

9. Podpora lokalizace

Vąechny knihovny mají určitou podporu pro lokalizaci aplikace (překlad statických textů v programu do jiných jazyků, téľ i18n=internationalization). To vyľaduje jednak označit texty k překladu ve zdrojovém kódu, a následně vytvořit jejich překlad, obvykle v samostatném souboru.
GTK a wxWindows pouľívají std. unixový nástroj gettext. Řetězce jsou v souboru označené makrem _("řetězec"). gettext je pak extrahuje do souboru .po, pro který existují editační nástroje (poEdit). Přeloľený .po soubor lze po zkompilování na .mo pouľít k lokalizaci jiľ existujícího programu.
Qt pouľívá vlastní, ale podobný postup. Makro tr("řetězec","kontext") tu navíc má druhý parametr umoľňující diferenciaci překladu podle kontextu. Na editaci překládaných textů má, opět vlastní, nástroj Qt Linguist.
Tcl má ke stejnému účelu balík msgcat:
   "Open" se zapíąe jako; ::msgcat::mc "Open"
   v souboru cs_CZ.msg, který je také skriptem, pak bude
   ::msgcat::mcset cs_CZ "Open" "Otevřít"
V Javě problém řeąí java.util.Locale a daląí třídy, lokalizované řetězce jsou uloľeny v samostatném souboru .properties nebo samostatné třídě. Na místě řetězců v kódu jsou ale jen identifikátory, coľ nepříspívá k přehlednosti.

10. Testovací aplikace

Testovací aplikace je jednoduchý dialog se zákkladními prvky UI - textovým polem, tlačítky, přepínači a zaąkrtávacím polem. Výběr (typicky kliknutí myąí) těchto prvků je oąetřen událostmi a indikován v textovém poli. U zaąkrtávacího pole je navíc indikován jeho aktuální stav. Byla implementována ve vąech ąesti knihovnách a pod dvěma operačními systémy - Windows NT/2000 a Linuxem s prostředím WindowMaker.
V GTK bylo vyuľito návrhového prostředí Glade, které vygenerovalo funkční kostru aplikace, vlastní kód stačilo přidat do souboru callbacks.c. K tomu potřebné tři funkce GTK knihovny nebylo sloľité v dokumentaci nalézt.
Při návrhu aplikace v Qt jsem rozhraní navrhl ručně jako tříúrovňovou hiearchii tříd QHBoxLayout/QVBoxLayout. Způsob návrhu (sublayout=new sublayout; sublayout->add(widget); layout->add(sublayout);) je velmi podobný jako o generovaného kódu GTK verze. Větąinu kódu aplikace zde tvoří "meta object code" vygenerovaný během překladu a provazující sloty (příjemce událostí-signálů) s metodami.
Ve verzích pro Tk, wxWindows a Javu jsem kód aplikace vytvořil zcela ručně "from the scratch" s inspirací kódem příkladů dodaných s SDK. V javovských verzích je pouľít jako LayoutManager třída GridBackLayout, která jako jediná umoľňuje definovat buňky zabírající více polí mříľky.
Následuje tabulka s délkou kódu aplikace pro jednotlivé knihovny a galerie screenshotů. Údaj v závorce značí podíl vlastního kódu, verzi pro wxWindows se nepodařilo přeloľit pod MS Windows.

Qt241(102) řádek
GTK476(79) řádek
wxWindows58 řádek
Tcl/Tk56 řádek
Java-AWT100 řádek
Java-Swing105 řádek

GTK, Windows
GTK, Windows
Qt, Windows
Qt, Windows
Tcl/Tk, Windows
Tcl/Tk, Windows
AWT, Windows
AWT, Windows
Swing, Windows
Swing, Windows
GTK, Linux
GTK, Linux
Qt, Linux
Qt, Linux
wxWindows, Linux
wxWindows, Linux
Tcl/Tk, Linux
Tcl/Tk, Linux
AWT, Linux
AWT, Linux
Swing, Linux
Swing, Linux

11. Shrnutí

Pokusím se o stručnou a zjednoduąenou analýzu, kdy je která knihovna vhodná.

12. Daląí UI toolkity

Pro návrh UI pouľitelného na více platformách lze vyuľít i daląí knihovny, zde nerozebírané, např. UI Smalltalku nebo Lispu, které jsou ale spjaté s těmito jazyky. Specifickou oblastí jsou internetové www aplikace - jazyk HTML je multiplatformní od svého vzniku a pomocí formulářů s CGI, či JavaScriptu s DHTML lze UI vytvořit. V poslední době se k tvorbě internetových aplikací pouľívá i formát Flash od firmy Macromedia, původně animační formát.

13. Soubory