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