Ultimate++

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 5. října 2020; kontroly vyžadují 8 úprav .
Ultimate++

Snímek U++ TheIDE (vybraný editor rozvržení)
Typ Knihovna prvků rozhraní (widgetů) , IDE
Vývojář Mirek Fídler, Iñaki Zabala, Tomáš Rylek, Daniel Kos, Massimo Del Fedele, Zbigniew Rębacz + členové projektu
Zapsáno v C++
Operační systém Křížová platforma
Nejnovější verze 2022.2 (rev. 16270) ( 27. května 2022 )
Licence BSDL
webová stránka ultimatepp.org

Ultimate++ (také známý jako U++ a UPP ) je sada nástrojů pro vývoj softwaru pro více platforem v programovacím jazyce C++ . Cílem U++ je snížit složitost typických desktopových aplikací intenzivním využíváním funkcí C++. Běží na Linux / X11 , BSD / X11 , Windows a od verze 2019.1 MacOS X. Vývojová podpora pro Android je ve vývoji [1] .

Projekt se vyvíjí od roku 1999 , jádro týmu Ultimate++ tvoří čeští programátoři.

Funkce

Složení a účel rámce

Je to framework navržený nejen pro rychlý vývoj GUI aplikací, ale v ideálním případě také pro nahrazení všech knihoven a nástrojů třetích stran pro C++, včetně STL (které v U ++ hraje knihovna NTL - Nová knihovna šablon). Ultimate++ je tímto způsobem podobný Qt , i když jde v tomto směru ještě dále. UPP však na rozdíl od Qt nerozšiřuje C++ o nestandardní zdrojové makroprocesory, všechny nástroje na vysoké úrovni tohoto frameworku, které vypadají jako rozšíření jazyka C++, jsou implementovány prostřednictvím standardních mechanismů, jako je šablonové metaprogramování a makra . Díky tomu je možné při vytváření rozhraní použít mechanismus šablon, což umožňuje dosáhnout kompaktního a snadno čitelného kódu. Pokud jde o stručnost, kód napsaný pomocí U++ připomíná moderní skriptovací jazykynadúrovně “ .

Ultimate++ obsahuje následující knihovny:

Všechny tyto komponenty jsou navrženy pro použití společně a nejsou navrženy tak, aby fungovaly samostatně. Ultimate++ používá specifickou organizaci kódu ve formě takzvaných „balíčků“, takže vývoj s Ultimate++, ale bez použití TheIDE je nepravděpodobný[ upřesnit ] možné v praxi.

Organizace zdrojů

Zdrojový kód v U++ se vyskytuje v kategoriích balíčků (myšlenka známá vývojářům Delphi nebo Lazarus ), spíše než v nesourodých knihovnách a zdrojových souborech. Technicky je balíček pouze samostatným adresářem obsahujícím zdrojové kódy, který také obsahuje popisný soubor s příponou upp. Soubory .upp jsou automaticky aktualizovány IDE a jsou podobné jako soubory s popisy závislostí a kompilacemi.

Když do projektu zahrnete balíček, IDE automaticky nastaví potřebné cesty a příznaky pro kompilátor. Samotný projekt je také balík, který lze propojit s dalšími balíkovými projekty. Několik balíčků je sloučeno do „hnízda“ (hnízdo) a hnízd se spojuje do kolekcí (sestav).

TheIDE umístí všechny programy v něm vytvořené do společného globálního stromu balíčků. Kořen stromu balíčků vybere uživatel při prvním spuštění IDE a všechny jeho programy budou uloženy pouze v podadresářích tohoto adresáře.

Funkce práce s widgety

Hlavní rozdíl od ostatních knihoven podobného účelu spočívá v tom, že všechny widgety jsou obvykle vytvářeny staticky, jako běžné proměnné členů třídy (i když je zachována i schopnost vytvářet widgety dynamicky). Existují speciální typy vstupních polí pro reálná a celá čísla. Například widgety okna kalkulačky lze popsat takto:

class MyWindow : public TopWindow { veřejnost : EditDouble val1 , val2 ; // Vstupní pole pro operandy Label l1 , l2 ; // Popisky pro vstupní pole DropList operation ; // Rozbalovací seznam operací Label l3 ; // Označení seznamu Button compute ; // Tlačítko Vypočítat Label result ; // Označení výsledku

Při ručním umísťování widgetů je pak musíme pomocí funkce umístit do okna programu Add(widget)(příklad použití viz sekce Hello World ).

Objekty podpory widgetů ve skutečnosti existují v dynamické paměti, ale jsou skryté z rozsahu a jsou vytvářeny a ničeny automaticky, pracujeme pouze s jejich statickými „obaly“. To vám umožní zbavit se ruční správy paměti, již nemůžete organizovat únik paměti tím, že zapomenete napsat delete . Je dobrým zvykem programovat s Ultimate++, abyste nikdy nepoužívali ukazatele ke správě zdrojů. Ke správě datových sad různé velikosti nebo polymorfního typu se používají kontejnery NTL. V NTL nejsou žádné „chytré ukazatele“ (jako boost ::shared_ptr ), nejsou potřeba a jsou považovány za špatný postup. Tento přístup ke správě paměti v C++ se osvědčil, prakticky se vyrovnal garbage collection z hlediska použitelnosti a předčí jej z hlediska výkonu a deterministického chování programu.

Každý widget v U++ má nějaký „přirozený“ význam. Takže pro vstupní pole bude hodnotou zadaný text, pro seznam - vybraný prvek, pro tlačítko - handler funkce pro jeho stisknutí. Operátor ~widget (vrací hodnotu typu variant Value) se používá k získání hodnoty widgetu a operátor hodnoty widget <<= se používá k jejímu nastavení . Chcete-li nastavit hodnotu widgetu, například tlačítka, na funkci handleru, je potřeba „zabalit“ název resp. členskou funkci třídy do makra THISBACK().

Ve většině knihoven GUI, jako je Qt , každý widget uchovává seznam ukazatelů na své potomky, tj. hierarchie widgetů je vlastností instancí widgetů a nezávisí na pořadí, ve kterém jsou definovány v těle třídy. V Ultimate++ je však hierarchie definována výhradně na úrovni třídy – každý kontejnerový widget obsahující další widgety je definován jako třída, jejíž členy jsou všechny vnořené widgety.

Použití Editoru rozložení

Existuje alternativa k ručnímu umístění widgetů do konstruktoru oken – editor vizuálního rozvržení (Layout Editor). Rozvržení v něm vytvořená jsou správně v C++ a zahrnují soubory, které používají speciální makra a mají příponu .lay . Abychom mohli pracovat s rozloženími, musíme do našeho souboru C++ zahrnout knihovnu záhlaví lay.h, která automaticky zahrnuje soubor rozložení zadaný pomocí #define LAYOUTFILE.

#define LAYOUTFILE <demo/demo1.lay> #include <CtrlCore.h>

Pokud se rozvržení nazývá například main , pak jej pro připojení ke třídě hlavního okna programu musíte deklarovat jako

class MyWindow : public Withmain < TopWindow > {

kde Withmain je třída šablony automaticky generovaná makry lay.h na základě souboru Lay. Používá spíše šablonu než jednoduchou třídu nebo strukturu, takže jako základní třídu můžete použít jakýkoli typ widgetu , nejen dialogové okno ( TopWindow ).

Chcete-li uspořádat widgety okna podle rozvržení, musíte na začátku konstruktoru souboru přidat volání

CtrlLayout ( * this );

Tento přístup k úpravám vizuálního rozhraní umožňuje staticky kompilovat soubory odkazů namísto jejich interpretace za běhu, jak to dělá mnoho nástrojů GUI, což vede ke zvýšení výkonu aplikací vytvořených v Ultimate++.

Editor rozvržení však není úplný editor vizuálního rozhraní jako QtDesigner nebo Glade . Umožňuje pouze nastavit názvy a relativní pozice widgetů stejné úrovně hierarchie. Všechny vlastnosti widgetů (kromě těch nejjednodušších, jako je nápis na tlačítku) a logika jejich interakce jsou zapsány v kódu programu.

Příklady

Minimální aplikace

#include <CtrlLib/CtrlLib.h> pomocí jmenného prostoru Upp ; GUI_APP_MAIN { }

Vytvoření okna

#include <CtrlLib/CtrlLib.h> pomocí jmenného prostoru Upp ; class MyWindow : public TopWindow { veřejnost : Moje okno () { název ( "Ahoj světe!" ); MinimizeBox (); MaximizeBox (); Rozměrný (); SetRect ( 0 , 0 , 300 , 300 ); } }; GUI_APP_MAIN { Moje okno (). běh (); }

ahoj světe

Následující příklad vytvoří (bez použití vizuálního editoru) aplikaci s tlačítkem "HelloWorld".

#include <CtrlLib/CtrlLib.h> pomocí jmenného prostoru Upp ; class MyApp : public TopWindow { typedef MyApp CLASSNAME ; veřejnost : MojeAplikace () { titul ( "ahoj světe" ); tlačítko . SetLabel ( "Ahoj světe!" ); tlačítko <<= THISBACK ( Klikněte ); Přidat ( tlačítko . HSizePos ( 100 , 100 ). VSizePos ( 100 , 100 )); } soukromý : void Click () { if ( PromptYesNo ( "Bylo kliknuto na tlačítko. Chcete skončit?" )) přestávka (); } Tlačítko tlačítko ; }; GUI_APP_MAIN { mojeAplikace (). běh (); }

Složitější příklad

V sekci Comparisons na oficiálních stránkách můžete najít příklady vytvoření poměrně složitého formuláře v U++ a porovnat jej s implementací podobné funkcionality v Qt , wxWidgets a Java / Swing .

Poznámky

  1. Práce s Android Builder . Získáno 22. prosince 2019. Archivováno z originálu dne 22. prosince 2019.

Odkazy