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.