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
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.
- gallery - testovací aplikace
- yesno - příklad vracející návratový kód pro
další zpracování
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.
Qt | 241(102) řádek |
GTK | 476(79) řádek |
wxWindows | 58 řádek |
Tcl/Tk | 56 řádek |
Java-AWT | 100 řádek |
Java-Swing | 105 řádek |
GTK, Windows |
Qt, Windows |
|
Tcl/Tk, Windows |
AWT, Windows |
Swing, Windows |
GTK, Linux |
Qt, Linux |
wxWindows, Linux |
Tcl/Tk, Linux |
AWT, Linux |
Swing, Linux |
11. Shrnutí
Pokusím se o stručnou a zjednodušenou analýzu, kdy je která knihovna vhodná.
- chceme především vyvíjet aplikaci s profesionálním vzhledem ve Windows a mít
i verzi pro Linux -> Qt
- totéž, ale nemáme tolik prostředků -> wxWindows
- stávající aplikaci v MFC potřebujeme portovat na jiné platformy -> wxWindows
- chceme vyvíjet OpenSource aplikaci pod GPL -> GTK, wxWindows
- potřebujeme jednoduchou interakci se skriptem -> Tcl/Tk
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
- nur-gui.zip - archiv testovacích aplikací,
prezentace a tohoto dokumentu.