WxWidgets

Technology
12 hours ago
8
4
2
Avatar
Author
Albert Flores

WxWidgets je knihovna multiplatformního vývoje grafického uživatelského rozhraní (GUI). Je navrhnutá pro tvorbu přenositelných aplikací, které mohou být spuštěny na různých operačních systémech, jako je Windows, macOS, Linux a další. Knihovna poskytuje sadu nástrojů a tříd pro vytváření interaktivních grafických aplikací s různými prvky uživatelského rozhraní, jako jsou okna, tlačítka, dialogy, menu a další. WxWidgets je napsána v programovacím jazyku C++ a poskytuje API (rozhraní pro programování aplikací) pro mnoho dalších programovacích jazyků, včetně jazyků Python, Perl, Ruby, Java a dalších. Tím umožňuje programátorům psát aplikace v preferovaném jazyce a používat přitom výhody knihovny pro tvorbu GUI. Knihovna WxWidgets je distribuována pod licencí LGPL (Lesser General Public License), což znamená, že je možné ji používat a upravovat i v komerčních projektech, aniž by bylo potřeba zveřejňovat zdrojový kód aplikace. WxWidgets vznikla v roce 1992 pod názvem WXWindows a od té doby se stala populární mezi vývojáři po celém světě. Na české Wikipedii je stránka o WxWidgets, která poskytuje podrobné informace o knihovně, včetně historie, funkcí, podporovaných operačních systémů, příkladů kódu a dalších. Tato stránka je užitečným zdrojem informací pro každého, kdo se zajímá o tvorbu multiplatformních grafických aplikací pomocí WxWidgets.

wxWidgets („Windows and X widgets“, dříve známý jako wxWindows) je free software/open source multiplatformní widget toolkit. Je to knihovna základních elementů pro tvorbu grafického uživatelského rozhraní (GUI).

Vývoj začal v roce 1992 díky Julianu Smartovi, který je dodnes vývojářem jádra.

wxWidgets umožňuje zkompilovat a spustit program na několika počítačových platformách s minimálními nebo žádnými změnami kódu. To zahrnuje systémy jako Windows, Macintosh, Linux/Unix (X11, Motif, a GTK+), OpenVMS a OS/2. +more Verze pro embedded systémy je ve vývoji.

Knihovna je implementována v C++, ale její používání je možné v mnoha běžně používaných programovacích jazycích, mezi nimi jsou například: Python (wxPython), C#, Erlang (wxErlang), Haskell (wxHaskell), Lua (wxLua), Perl (wxPerl), Ruby (wxRuby), Smalltalk (wxSqueak), Java (wx4j) a také JavaScript (wxJS).

wxWidgets je nejlépe popsán jako nativní toolkit. Místo napodobování grafiky prvků používá nativní grafické prvky na podporovaných platformách.

Jméno změněno z wxWindows na wxWidgets

20. +more února 2004 vývojáři wxWindows oznámili, že projekt změnil jméno na wxWidgets, jako výsledek tlaku Microsoftu. Julian Smart chtěl respektovat obchodní známku Microsoftu ve Velké Británii - Windows.

Hierarchie toolkitu

wxWidgets obsahuje několik důležitých tříd, jsou to především: * wxString - implementace textových řetězců * wxObject - předek veškerých tříd ve wxWidgets, které používají běhové informace o typech * wxEvtHandler - třída, která má na starosti předávání událostí * wxWindow - objekty, které mají grafickou reprezentaci jsou potomky této třídy

Jednoduchý program

Standardní C++ program začíná ve funkci main, ta se na různých platformách a při různém použití může jmenovat jinak (např. ve Windows se jedná o WinMain). +more V této hlavní funkci je třeba zinicializovat smyčku pro vyzvedávání zpráv od operačního systému a vytvořit okno aplikace. WxWidgets tuto funkcionalitu velmi dobře zapouzdřují a programátor se nemusí starat, jak se toto implementuje na jiných platformách.

Příklad jednoduché aplikace:

#include #include

class MyApp: public wxApp { public: MyApp {} ~MyApp {} virtual bool OnInit { bool wasSuccess = false; wxFrame * frame = new wxFrame(0,wxID_ANY,_T("NOVÉ OKNO"));

if (frame) // kontrola alokace paměti { SetTopWindow(frame); // zaregistrování okna jako nejvyšší okno aplikace frame->Show(true); wasSuccess = true; }

return wasSuccess; } }; IMPLEMENT_APP(MyApp)

Třída wxApp má tyto úkoly: * nastavit a získat globální vlastnosti aplikace * zajistit komunikaci s operačním systémem např. vytvoření tzv. +more „Event Loop“, což je nekonečná smyčka čekající na zprávy od operačního systému, které následně převádí na události pro tento toolkit * provést kód v metodě OnInit, tu definuje programátor, pokud vrátí false, dáme wxWidgets najevo, že se nezdařila inicializace a aplikace se ukončí * zpracovávat události, které nejsou zachyceny v jiných objektech v aplikaci.

Vkládání ovládacích prvků

Ovládací prvky se vytvářejí pomocí operátoru new. V konstruktoru se musí uvést ukazatel na rodičovské okno (oknem se zde rozumí objekt, jenž je potomkem wxWindow). +more Tím je dáno v jakém okně bude ovládací prvek vložený. Rodičovské okno se postará ve svém destruktoru o uvolnění všech objektů v něm vložených.

Příklad vložení tlačítka:

new wxButton(this, wxID_ANY,_T("Tlačítko")); // this je potomkem wxWindow

Rozvržení ovládacích prvků

Obecně platí, že komponentám není dobré nastavovat absolutní velikosti a pozice, protože v rámci různých jazyků a nastavení zobrazovacího zařízení mohou mít jiné velikosti, než se kterými vývojář počítal. Ve wxWidgets tuto správu zajišťuje tzv. +more wxSizer, což je abstraktní třída, která obsahuje předpis [rozhraní] pro ostatní specializované sizery.

Mezi ty základní patří tyto třídy: * wxBoxSizer - ten umí řadit prvky vertikálně, nebo horizontálně za sebe, podle nastavení * wxGridSizer - sestavuje prvky do tabulky, kde se velikost určuje podle nejširšího a nejvyššího ovládacího prvku * wxFlexGridSizer - dělá také z ovládacích prvků tabulku, kde všechny prvky v jedné řádce mají stejnou výšku a všechny prvky v jednom sloupci šířku

Sizer dostává události o změně velikosti okna a upravuje velikosti a pozice prvků v něm vložených. Prvkem vloženým do sizeru může být i jiný sizer, ten má potom na starosti velikost a pozice svých prvků v přidělené buňce. +more Oknu, ve kterém má sizer působit, se musí předat na sizer ukazatel funkcí SetSizer, kterou má v sobě už wxWindow. Okno, ke kterému sizer náleží, si zajistí samo jeho uvolnění z paměti v případě zničení okna.

Příklad použití wxBoxSizeru (operace probíhají v konstruktoru nějakého okna):

wxSizer * sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(new wxButton(this, wxID_NEW,_T("Tlačítko jedna"))); //vložení tlačítka do sizeru

SetSizer(sizer); //nastaví oknu sizer pro správu rozložení ovládacích prvků sizer->SetSizeHints(this); //nastaví oknu minimální možnou velikost v závislosti na vložených prvcích Layout; //provede první přepočítání rozvržení

Zachytávání událostí

Primárně k zachytávání událostí slouží statické tabulky událostí. Tyto tabulky obsahují identifikátor události, identifikátor ovládacího prvku a funkci, která se má zavolat po vyvolání události. +more Nad statickou tabulkou probíhá během překladu typová kontrola, takže se nám nemůže podařit přeložit program, který má událost připojenou na špatně deklarovanou funkci. Tuto vlastnost umožňují vlastnosti jazyka C++, které umožňují vytvářet definice typu funkcí.

Pokud chceme vytvářet tabulku událostí, musíme vytvořit potomka třídy wxEventHandler, nebo využijme nějakého jejího existujícího potomka. Tento nový wxEventHandler lze metodou PushEventHandler dosadit do okna a v tom případě se bude prohledávat i jeho tabulka událostí. +more Těchto event handlerů můžeme vložit několik, takže se pak vytvoří řetěz, který se bude prohledávat v případě vyvolání události.

Všechny ovládací prvky jsou potomky wxEventHandleru, tzn. , že při použití dědičnosti z jakéhokoliv okna můžeme vytvořit novou statickou tabulku událostí. +more Při vyvolání události se nejprve prochází tabulka událostí prvku který ji vyvolal a při nezachycení se prohledávají předkové, až když událost dorazí do wxWindow a stále se nenalezla vhodná kombinace v tabulce událostí, tak se událost postoupí nadřazenému prvku. Pokud událost nezachytí žádné okno je událost postoupena do objektu zastupující aplikaci, což je potomek wxApp. Je také možné po zachycení události nechat událost propagovat v hierarchii dále. Toho dosáhneme zavoláním metody Skip na wxEvent objektu.

Statická tabulka událostí se vytváří na dvou úrovních, poprvé je jí potřeba deklarovat v hlavičkovém souboru, kde do se kódu nové třídy vloží DECLARE_EVENT_TABLE.

Příklad deklarace statické tabulky událostí:

class wxCustomEventHandler : public wxEvtHandler { public: wxCustomEventHandler; virtual ~wxCustomEventHandler; private: void onButton(wxCommandEvent & event);

DECLARE_EVENT_TABLE; };

Dále je nutné tabulku definovat v implementačním souboru.

Příklad definice:

BEGIN_EVENT_TABLE(wxCustomEventHandler, wxEvtHandler) EVT_BUTTON(wxID_BACKWARD, wxCustomEventHandler::onButton) END_EVENT_TABLE

Další možností je připojovat a odpojovat spracovatele událostí za běhu aplikace pomocí metod Connect a Disconnect. Tato možnost je dobrá zejména při tvorbě vlastních ovládacích prvků.

Internacionalizace

Ve wxWidges je internacionalizace řešena pomocí třídy wxLocale, instance této třídy reprezentuje zvolené národní prostředí v aplikaci. Díky ní, se například datum formátuje specificky dle zvolené země. +more Pro lokalizaci textů můžeme využít makra „_“, které zkracuje volání funkce wxGetTranslation, jež má jediný parametr a tím je klíč k textu anebo přímo metody třídy wxLocale::GetString.

Příklad inicializace wxLocale:

wxLocale * locale = new wxLocale; locale->Init(wxLANGUAGE_CZECH); //nastavení aktuálního jazyka aplikace

/*složka v pracovním adresáři aplikace, ve které se budou hledat jazykové katalogy*/ locale->AddCatalogLookupPathPrefix(_T("lang/"));

locale->AddCatalog(_T("default")); //název souboru jazykového katalogu bez koncovky mo

Příklad použití lokalizovatelného řetězce:

wxString label = _("Jméno: ");

Pro tvorbu katalogů s překladem aplikace je vhodné použít buď přímo textových nástrojů gettext pro vyhledání klíčů ve zdrojových souborech a vygenerování „po“ souboru. Nebo lépe nějaké uživatelské nadstavby, kterou je například Poedit. +more V tomto nástroji je možné nastavit masku vyhledávaných funkcí/maker použitých pro lokalizaci a následně vygenerovat a spravovat jazykové katalogy. Program řeší i situace odebrání textových řetězců, takže lze katalogy udržovat jednoduše synchronizované. Pokud se lokalizační klíče generují automaticky za běhu aplikace musí se „po“ soubor vytvořit ručně.

Software založený na wxWidgets

aMule - 'All-platform' P2P klient založený na eMule * Audacity - svobodný/open source editor zvuků * Audiobook Cutter - Uživatelsky příjemný separátor MP3 audioknih. * Chandler - Personal Information Manager (PIM) zahrnuje kalendář, emaily, kontakty, úlohy a instant messaging * Code::Blocks - svobodný/open source, multiplatformní C++ IDE * e - Textový editor pro Windows * Fityk - open source a multiplatformní vědecký nástroj pro kování křivek * [url=http://mahogany. +moresourceforge. net/]Mahogany[/url] - open source a multiplatformní emailový klient * Monolith - nástroj k distribuci copyrightových dat * MUTE - anonymní sdílení souborů * [url=http://langorigami. com/science/treemaker/treemaker5. php4]TreeMaker[/url] - designovací program Roberta Langa na tvorbu origami. * WASTE - bezpečný P2P software pro malé sítě * wxCommunicator - multiplatformní SIP softphone.

Další software založený na wxWidgets naleznete [url=https://web. archive. +moreorg/web/20080707015616/http://www. wxcommunity. com/modules. php. op=modload&name=Downloads&file=index&req=viewdownload&cid=5]zde[/url].

Odkazy

Reference

Literatura

SMART, Julian, HOCK, Kevin. Cross-Platform GUI Programming with wxWidgets. 1st edition. United States of America : Pearson Education, Inc., 2005. 541 s. .

Související články

Object Windows Library * Visual Component Library * VCF * Microsoft Foundation Class Library * Qt * GTK+ * Tk * Gtkmm * FLTK * FOX toolkit * Ultimate++ * wxDev-C++

Externí odkazy

[url=http://wxwidgets. org/]Oficiální stránky[/url] * [url=https://web. +morearchive. org/web/20170116151401/http://wxforum. shadonet. com/]Neoficiální fórum[/url] * [url=http://www. wxwidgets. hustej. net/]Otevřený překlad volně šiřitelné knihy Juliana Smarta: Cross-Platform GUI Programming with wxWidgets do češtiny[/url].

Kategorie:Widget toolkity Kategorie:Knihovny na bázi X11 Kategorie:Svobodný software naprogramovaný v C++

5 min read
Share this post:
Like it 8

Leave a Comment

Please, enter your name.
Please, provide a valid email address.
Please, enter your comment.
Enjoy this post? Join Cesko.wiki
Don’t forget to share it
Top