Ultimate++

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 5 oktober 2020; kontroller kräver 8 redigeringar .
Ultimate++

U++ TheIDE ögonblicksbild (layoutredigerare vald)
Sorts Bibliotek med gränssnittselement (widgets) , IDE
Utvecklaren Mirek Fídler, Iñaki Zabala, Tomáš Rylek, Daniel Kos, Massimo Del Fedele, Zbigniew Rębacz + projektmedlemmar
Skrivet i C++
Operativ system Cross plattform
senaste versionen 2022.2 (rev. 16270) ( 27 maj 2022 )
Licens BSDL
Hemsida ultimatepp.org

Ultimate++ (även känd som U++ och UPP ) är en plattformsoberoende programvaruutvecklingsverktygssats i programmeringsspråket C++ . Målet med U++ är att minska komplexiteten hos typiska skrivbordsapplikationer genom att använda C++-funktioner hårt. Körs på Linux / X11 , BSD / X11 , Windows och sedan version 2019.1 av MacOS X. Utvecklingsstöd för Android är under utveckling [1] .

Projektet har utvecklats sedan 1999 , kärnan i Ultimate++-teamet består av tjeckiska programmerare.

Funktioner

Ramverkets sammansättning och syfte

Det är ett ramverk designat inte bara för att ge snabb utveckling av GUI -applikationer, utan också, idealiskt, för att ersätta alla tredjepartsbibliotek och verktyg för C ++, inklusive till och med STL (som i U ++ spelas av NTL-biblioteket - Nytt mallbibliotek). Ultimate++ liknar Qt på detta sätt, även om det går ännu längre i denna riktning. UPP, till skillnad från Qt, utökar dock inte C++ med icke-standardiserade källmakroprocessorer, alla verktyg på hög nivå i detta ramverk, som ser ut som tillägg av C++-språket, implementeras genom standardmekanismer som mallmetaprogrammering och makron . Detta gör det möjligt att använda mallmekanismen när man skapar ett gränssnitt, vilket gör det möjligt att uppnå kompakt och lättläsbar kod. När det gäller koncis, liknar kod skriven med U++ moderna " supernivå " skriptspråk .

Ultimate++ innehåller följande bibliotek:

Alla dessa komponenter är designade för att användas tillsammans och är inte designade för att fungera individuellt. Ultimate++ använder en specifik kodorganisation i form av så kallade "paket", så utveckling med Ultimate++, men utan att använda TheIDE är osannolik[ förtydliga ] möjligt i praktiken.

Organisering av källor

Källkod i U++ förekommer i kategorier av paket (en idé som är bekant för Delphi- eller Lazarus- utvecklare ), snarare än olika bibliotek och källfiler. Tekniskt sett är ett paket bara en separat katalog som innehåller källkoderna, som också innehåller en beskrivningsfil med en upp-tillägg. .upp-filer uppdateras automatiskt av IDE och liknar filer med beskrivningar av beroenden och kompileringsflaggor.

När du inkluderar ett paket i ett projekt kommer IDE att ställa in nödvändiga sökvägar och flaggor för kompilatorn automatiskt. Själva projektet är också ett paket som kan kopplas till andra paketprojekt. Flera paket kombineras till ett "bo" (bo), och bon kombineras till samlingar (sammansättningar).

TheIDE placerar alla program som skapats i det i ett gemensamt globalt paketträd. Roten till paketträdet väljs av användaren när IDE:n startas första gången, och alla dess program kommer endast att lagras i underkataloger till denna katalog.

Funktioner för att arbeta med widgets

Den största skillnaden från andra bibliotek med liknande syfte är att alla widgets vanligtvis skapas statiskt, som vanliga klassmedlemsvariabler (även om möjligheten att skapa widgets dynamiskt också bevaras). Det finns speciella typer av inmatningsfält för reella tal och heltal. Till exempel kan kalkylatorfönsterwidgetar beskrivas enligt följande:

class MyWindow : public TopWindow { offentliga : RedigeraDubbel val1 , val2 ; // Inmatningsfält för operander Label l1 , l2 ; // Etiketter för inmatningsfält DropList operation ; // Dropdown-lista över operationer Label l3 ; // Etikett för listan Button compute ; // Beräkna knapp Etikettresultat ; // Märk för resultatet

När vi sedan placerar widgets manuellt måste vi placera dem i programfönstret med hjälp av en funktion Add(widget)(se avsnittet Hello World för ett exempel på dess användning ).

Faktum är att widgetstödsobjekt finns i dynamiskt minne, men de är dolda från räckvidden och skapas och förstörs automatiskt, vi arbetar bara med deras statiska "omslag". Detta gör att du kan bli av med manuell minneshantering, du kan inte längre organisera en minnesläcka genom att glömma att skriva delete . Det är en bra praxis att programmera med Ultimate++ för att aldrig använda pekare för att hantera resurser. För att hantera datauppsättningar av variabel storlek eller polymorf typ används NTL-behållare. "Smarta pekare" (som boost ::shared_ptr ) finns inte i NTL, de behövs inte och anses vara dålig praxis. Detta tillvägagångssätt för minneshantering i C++ har visat sig väl, nästan lika bra som skräpinsamling när det gäller användbarhet och överträffar det när det gäller prestanda och programmets deterministiska beteende.

Varje widget i U++ har någon "naturlig" betydelse. Så för inmatningsfältet kommer värdet att vara den inmatade texten, för listan - det valda elementet, för knappen - funktionshanteraren för att trycka på den. ~widget- operatorn (returerar ett värde av varianttypen Value) används för att få värdet på en widget, och widget-värdeoperatorn <<= används för att ställa in det . För att ställa in värdet på en widget, till exempel en knapp, till en hanterarfunktion behöver du "linda" namnet resp. klassmedlemsfunktion till ett makro THISBACK().

I de flesta GUI-bibliotek, som Qt , håller varje widget en lista med pekare till sina underordnade, dvs. widgethierarkin är en egenskap hos widgetinstanser och beror inte på i vilken ordning de definieras i klasskroppen. I Ultimate++ definieras hierarkin enbart på klassnivå - varje containerwidget som innehåller andra widgets definieras som en klass, där alla kapslade widgetar är medlemmar.

Använda layoutredigeraren

Det finns ett alternativ till att manuellt placera widgets i fönsterkonstruktorn - den visuella layoutredigeraren (Layout Editor). Layouterna som skapas i den är C++-korrekta inkluderar filer som använder speciella makron och har tillägget .lay . För att arbeta med layouter måste vi inkludera lay.h-huvudbiblioteket i vår C++-fil, som automatiskt inkluderar layoutfilen som anges med hjälp av #define LAYOUTFILE.

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

Om layouten till exempel kallas main , måste du för att ansluta den till klassen i huvudprogramfönstret deklarera den som

class MyWindow : public Withmain < TopWindow > {

där Withmain är en mallklass som automatiskt genereras av lay.h-makron baserat på lay-filen. Den använder en mall snarare än en enkel klass eller struktur, så du kan använda vilken typ av widget som helst som basklass, inte bara en dialogruta ( TopWindow ).

För att ordna fönsterwidgetarna enligt layouten, i början av filkonstruktorn, måste du lägga till ett anrop

CtrlLayout ( * detta );

Detta tillvägagångssätt för redigering av visuellt gränssnitt gör det möjligt att statiskt kompilera länkfiler, snarare än att tolka dem vid körning, som många GUI-verktyg gör, vilket leder till ökad prestanda för applikationer skapade i Ultimate++.

Layoutredigeraren är dock inte en komplett visuell gränssnittsredigerare som QtDesigner eller Glade . Det låter dig bara ställa in namn och relativa positioner för widgets på samma nivå av hierarki. Alla egenskaper hos widgets (förutom de enklaste, som inskriptionen på en knapp) och logiken för deras interaktion skrivs i programkoden.

Exempel

Minsta ansökan

#include <CtrlLib/CtrlLib.h> använder namnutrymme Upp ; GUI_APP_MAIN { }

Skapa ett fönster

#include <CtrlLib/CtrlLib.h> använder namnutrymme Upp ; class MyWindow : public TopWindow { offentliga : MyWindow () { title ( "Hej världen!" ); MinimizeBox (); MaximizeBox (); Stor (); SetRect ( 0 , 0 , 300 , 300 ); } }; GUI_APP_MAIN { MyWindow (). köra (); }

hej världen

Följande exempel skapar (utan att använda den visuella redigeraren) en applikation med en "HelloWorld"-knapp.

#include <CtrlLib/CtrlLib.h> använder namnutrymme Upp ; class MyApp : public TopWindow { typedef MyApp KLASSNAMN ; offentliga : MyApp () { titel ( "hej världen" ); knappen . SetLabel ( "Hej världen!" ); knapp <<= THISBACK ( Klicka ); Lägg till ( knapp . HSizePos ( 100 , 100 ). VSizePos ( 100 , 100 )); } privat : void Klicka () { if ( PromptYesNo ( "Knappen klickades. Vill du avsluta?" )) bryta (); } Knappknapp ; _ }; GUI_APP_MAIN { minApp (). köra (); }

Ett mer komplext exempel

I avsnittet Jämförelser på den officiella webbplatsen kan du hitta exempel på att skapa en ganska komplex form i U++ och jämföra den med implementeringen av liknande funktionalitet i Qt , wxWidgets och Java / Swing .

Anteckningar

  1. Arbeta med Android Builder . Hämtad 22 december 2019. Arkiverad från originalet 22 december 2019.

Länkar