Végső++

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2020. október 5-én felülvizsgált verziótól ; az ellenőrzések 8 szerkesztést igényelnek .
Végső++

U++ TheIDE pillanatkép (elrendezésszerkesztő kiválasztva)
Típusú Interfész elemek könyvtára (widgetek) , IDE
Fejlesztő Mirek Fídler, Iñaki Zabala, Tomáš Rylek, Daniel Kos, Massimo Del Fedele, Zbigniew Rębacz + a projekt résztvevői
Beírva C++
Operációs rendszer Cross platform
legújabb verzió 2022.2 (rev. 16270) ( 2022. május 27. )
Engedély BSDL
Weboldal ultimatepp.org

Az Ultimate++ (más néven U++ és UPP ) egy többplatformos szoftverfejlesztési eszköztár a C++ programozási nyelven . Az U++ célja, hogy csökkentse a tipikus asztali alkalmazások bonyolultságát a C++ funkciók erőteljes kihasználásával. Linux / X11 , BSD / X11 , Windows és a MacOS X 2019.1-es verziója óta fut . Az Android fejlesztési támogatása fejlesztés alatt áll [1] .

A projekt 1999 óta fejlődik , az Ultimate++ csapatának magját cseh programozók alkotják .

Jellemzők

A keretrendszer összetétele és célja

Ez egy olyan keretrendszer, amely nemcsak a grafikus felhasználói felületek gyors fejlesztését szolgálja, hanem ideális esetben minden harmadik féltől származó könyvtárat és eszközt lecserél a C ++-hoz, beleértve az STL -t is (amelyet U ++-ban az NTL-könyvtár játszik le - Új sablonkönyvtár). Az Ultimate++ ebben a tekintetben hasonlít a Qt -re, bár ebbe az irányba még tovább megy. A UPP azonban, ellentétben a Qt-vel, nem bővíti ki a C++-t nem szabványos forrásmakró processzorokkal, ennek a keretrendszernek minden magas szintű eszköze, amely úgy néz ki, mint a C++ nyelv kiterjesztése, olyan szabványos mechanizmusokon keresztül valósul meg, mint a sablon metaprogramozás és makrók . Ez lehetővé teszi a sablon mechanizmus használatát interfész létrehozásakor, amely lehetővé teszi a kompakt és könnyen olvasható kód elérését. A tömörség szempontjából az U++ használatával írt kód a modern „ szuperszintű ” szkriptnyelvekre hasonlít .

Az Ultimate++ a következő könyvtárakat tartalmazza:

Mindezek az alkatrészek együttes használatra készültek, és nem külön-külön. Az Ultimate++ egy meghatározott kódszervezést használ úgynevezett "csomagok" formájában, így a fejlesztés Ultimate++-szal, de TheIDE nélkül nem valószínű[ pontosítás ] lehetséges a gyakorlatban.

A források rendszerezése

Az U++ forráskódja csomagkategóriákban fordul elő (ez a Delphi vagy a Lazarus fejlesztői számára ismerős ötlet ), nem pedig az eltérő könyvtárakban és forrásfájlokban. Technikailag egy csomag csak egy különálló könyvtár, amely tartalmazza a forráskódokat, amely egy UPP kiterjesztésű leíró fájlt is tartalmaz. Az .upp fájlokat az IDE automatikusan frissíti, és hasonlóak a függőségek leírását és a fordítási jelzőket tartalmazó fájlokhoz.

Amikor egy csomagot belefoglal egy projektbe, az IDE automatikusan beállítja a fordítóhoz szükséges elérési utakat és jelzőket. Maga a projekt is egy olyan csomag, amely más csomagprojektekhez kapcsolható. Több csomagot „fészekbe” (fészekbe) egyesítenek, a fészkeket pedig gyűjteményekké (összeállításokká) egyesítik.

A TheIDE az összes benne létrehozott programot egy közös globális csomagfába helyezi. A csomagfa gyökerét a felhasználó választja ki az IDE első indításakor, és minden programja csak ennek a könyvtárnak az alkönyvtáraiban lesz tárolva .

A widgetekkel való munka jellemzői

A fő különbség a többi hasonló célú könyvtárhoz képest az, hogy az összes widgetet általában statikusan hozzák létre, mint a közönséges osztálytag változókat (bár a widgetek dinamikus létrehozásának lehetősége is megmarad). Vannak speciális típusú beviteli mezők a valós és egész számokhoz. Például a számológép ablak widgetjei a következőképpen írhatók le:

class MyWindow : public TopWindow { nyilvános : EditDouble érték1 , érték2 ; // Operandusok beviteli mezői Címke l1 , l2 ; // A beviteli mezők címkéi DropList művelet ; // Műveletek legördülő listája Label l3 ; // A lista címkéje Button compute ; // Számítás gomb Eredmény felcímkézése ; // Címke az eredményhez

Ezután a widgetek kézi elhelyezésekor egy függvény segítségével el kell helyeznünk őket a program ablakában Add(widget)(a használatára lásd a Hello World részt ).

Valójában a widget támogató objektumok léteznek a dinamikus memóriában, de rejtve vannak a hatókör elől, és automatikusan jönnek létre és semmisülnek meg, mi csak a statikus "csomagolóikkal" működünk. Ez lehetővé teszi, hogy megszabaduljon a kézi memóriakezeléstől, már nem szervezheti meg a memóriaszivárgást , ha elfelejti írni a delete . Jó gyakorlat az Ultimate++ programozása, hogy soha ne használjon mutatókat az erőforrások kezelésére. A változó méretű vagy polimorf típusú adatkészletek kezelésére NTL-tárolókat használnak. Az NTL-ben nincsenek "okos mutatók" (mint például a boost ::shared_ptr ), nincs rájuk szükség, és rossz gyakorlatnak számítanak. A C++ memóriakezelésének ez a megközelítése jól bevált, gyakorlatilag a használhatóság tekintetében megegyezik a szemétgyűjtéssel , a program teljesítményében és determinisztikus viselkedésében pedig felülmúlja azt.

Minden U++ widgetnek van valamilyen "természetes" jelentése. Tehát a beviteli mezőnél a beírt szöveg lesz az érték, a listánál - a kiválasztott elem, a gombnál - a megnyomásának funkciókezelője. A ~widget operátor (a változat típusú értéket adja vissza Value) a widget értékének lekérésére szolgál, a widget <<= érték operátora pedig a beállítására szolgál . Ahhoz, hogy egy widget, például egy gomb értékét kezelő függvényre állítsuk, a nevet, ill. osztálytag függvényt makróvá THISBACK().

A legtöbb GUI-könyvtárban, például a Qt -ben, minden widget egy listát vezet a gyermekei mutatóiról, azaz a widget-hierarchia a widget-példányok tulajdonsága, és nem függ attól, hogy milyen sorrendben vannak meghatározva az osztálytörzsben. Az Ultimate++-ban azonban a hierarchia kizárólag osztályszinten van meghatározva – minden más widgeteket tartalmazó konténer-widget osztályként van meghatározva, amelynek minden beágyazott widget tagja.

Az elrendezésszerkesztő használata

Van egy alternatíva a widgetek manuális elhelyezésére az ablakkonstruktorban – ez a vizuális elrendezésszerkesztő (Layout Editor). A benne létrehozott elrendezések C++-helyesek, speciális makrókat használó, .lay kiterjesztésű fájlokat tartalmaznak . Az elrendezésekkel való munkavégzéshez a C++ fájlunkba bele kell foglalnunk a lay.h fejléckönyvtárat, amely automatikusan tartalmazza a segítségével megadott elrendezési fájlt #define LAYOUTFILE.

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

Ha az elrendezést például mainnak hívjuk, akkor a fő programablak osztályához való csatlakoztatásához úgy kell deklarálnia, hogy

class MyWindow : public Withmain < TopWindow > {

ahol a Withmain egy sablonosztály, amelyet a lay.h makrók automatikusan generálnak a lay fájl alapján. Egyszerű osztály vagy struktúra helyett sablont használ, így bármilyen típusú widgetet használhat alaposztályként, nem csak párbeszédpanelt ( TopWindow ).

Az ablak widgetek elrendezés szerinti elrendezéséhez a fájlkonstruktor elején hozzá kell adni egy hívást

CtrlLayout ( * ez );

A vizuális interfész szerkesztésének ez a megközelítése lehetővé teszi a hivatkozásfájlok statikus fordítását, ahelyett, hogy futás közben értelmeznék őket, ahogyan azt sok grafikus felület eszköz teszi, ami az Ultimate++-ban létrehozott alkalmazások teljesítményének növekedéséhez vezet.

Az elrendezésszerkesztő azonban nem egy teljes vizuális felület szerkesztő, mint a QtDesigner vagy a Glade . Csak az azonos hierarchiaszintű widgetek nevének és relatív pozícióinak beállítását teszi lehetővé. A widgetek minden tulajdonsága (kivéve a legegyszerűbbeket, mint például a gombon lévő felirat) és interakciójuk logikája a programkódba van írva.

Példák

Minimális jelentkezés

#include <CtrlLib/CtrlLib.h> névtér használatával Upp ; GUI_APP_MAIN { }

Ablak létrehozása

#include <CtrlLib/CtrlLib.h> névtér használatával Upp ; class MyWindow : public TopWindow { nyilvános : MyWindow () { title ( "Helló világ!" ); Minimalizálás Box (); MaximizeBox (); Méretes (); SetRect ( 0 , 0 , 300 , 300 ); } }; GUI_APP_MAIN { MyWindow (). futni (); }

helló világ

A következő példa létrehoz (a vizuális szerkesztő használata nélkül) egy alkalmazást a „HelloWorld” gombbal.

#include <CtrlLib/CtrlLib.h> névtér használatával Upp ; class MyApp : public TopWindow { typedef MyApp OSZTÁLYNÉV ; nyilvános : Saját alkalmazás () { title ( "hello world" ); gomb . SetLabel ( "Hello world!" ); gomb <<= THISBACK ( Kattintson ); Hozzáadás ( gomb . HSizePos ( 100 , 100 ). VSizePos ( 100 , 100 )); } privát : void Kattintás () { if ( PromptYesNo ( "A gombra kattintottak. Ki akar lépni?" )) szünet (); } Gomb gomb ; }; GUI_APP_MAIN { myApp (). futni (); }

Egy bonyolultabb példa

A hivatalos oldal Összehasonlítások részében példákat találhat egy meglehetősen összetett űrlap létrehozására U++ nyelven, és összehasonlíthatja azt a Qt , wxWidgets és Java / Swing hasonló funkcióinak megvalósításával .

Jegyzetek

  1. Az Android Builder használata . Letöltve: 2019. december 22. Az eredetiből archiválva : 2019. december 22.

Linkek