Lopullinen++

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 5.10.2020 tarkistetusta versiosta . tarkastukset vaativat 8 muokkausta .
Lopullinen++

U++ TheIDE-tilanne (asettelueditori valittu)
Tyyppi Käyttöliittymäelementtien kirjasto (widgetit) , IDE
Kehittäjä Mirek Fídler, Iñaki Zabala, Tomáš Rylek, Daniel Kos, Massimo Del Fedele, Zbigniew Rębacz + projektin osallistujat
Sisään kirjoitettu C++
Käyttöjärjestelmä Poikkitaso
uusin versio 2022.2 (rev. 16270) ( 27.5.2022 )
Lisenssi BSDL
Verkkosivusto ultimatepp.org

Ultimate++ (tunnetaan myös nimellä U++ ja UPP ) on C++-ohjelmointikielellä monikäyttöinen ohjelmistokehityksen työkalupakki . U++:n tavoitteena on vähentää tyypillisten työpöytäsovellusten monimutkaisuutta käyttämällä runsaasti C++-ominaisuuksia. Toimii Linux / X11- , BSD / X11- , Windows- ja MacOS X :n versiosta 2019.1 lähtien. Kehitystuki Androidille on kehitteillä [1] .

Projektia on kehitetty vuodesta 1999 lähtien, Ultimate++ -tiimin ytimen muodostavat tšekkiläiset ohjelmoijat.

Ominaisuudet

Kehyksen koostumus ja tarkoitus

Se on kehys, joka ei ole suunniteltu ainoastaan ​​tarjoamaan nopeaa GUI- sovellusten kehittämistä, vaan myös ihannetapauksessa korvaamaan kaikki kolmannen osapuolen kirjastot ja työkalut C ++:lle, mukaan lukien jopa STL (jota U ++:ssa soittaa NTL-kirjasto - Uusi mallikirjasto). Ultimate++ on tällä tavalla samanlainen kuin Qt , vaikka se menee vielä pidemmälle tähän suuntaan. Toisin kuin Qt, UPP ei kuitenkaan laajenna C++:aa epätyypillisillä lähdemakroprosessoreilla, vaan kaikki tämän kehyksen korkean tason työkalut, jotka näyttävät C++-kielen laajennuksilta, toteutetaan vakiomekanismeilla, kuten template meta ja makrot . Tämä mahdollistaa mallimekanismin käytön rajapinnan luomisessa, mikä mahdollistaa kompaktin ja helposti luettavan koodin aikaansaamisen. U++:lla kirjoitettu koodi muistuttaa ytimekkäästi nykyaikaisia ​​" supertason " komentosarjakieliä .

Ultimate++ sisältää seuraavat kirjastot:

Kaikki nämä osat on suunniteltu käytettäviksi yhdessä, eikä niitä ole suunniteltu toimimaan erikseen. Ultimate++ käyttää tiettyä koodiorganisaatiota niin sanottujen "pakettien" muodossa, joten kehitys Ultimate++:n kanssa, mutta ilman TheIDE:tä on epätodennäköistä.[ selventää ] mahdollista käytännössä.

Lähteiden järjestys

Lähdekoodi U++:ssa esiintyy pakettien luokissa (idea on tuttu Delphi- tai Lazarus -kehittäjille ) erilaisten kirjastojen ja lähdetiedostojen sijaan. Teknisesti paketti on vain erillinen lähdekoodit sisältävä hakemisto, joka sisältää myös kuvaustiedoston upp-tunnisteella. IDE päivittää .upp-tiedostot automaattisesti, ja ne ovat samanlaisia ​​kuin tiedostot, joissa on kuvaukset riippuvuuksista ja käännöslipuista.

Kun sisällytät paketin projektiin, IDE asettaa tarvittavat polut ja liput kääntäjälle automaattisesti. Itse projekti on myös paketti, joka voidaan liittää muihin pakettiprojekteihin. Useat paketit yhdistetään "pesäksi" (pesäksi), ja pesät yhdistetään kokoelmiksi (kokoonpanoiksi).

TheIDE sijoittaa kaikki siinä luodut ohjelmat yhteiseen globaaliin pakettipuuhun. Käyttäjä valitsee pakettipuun juuren, kun IDE käynnistetään ensimmäisen kerran, ja kaikki sen ohjelmat tallennetaan vain tämän hakemiston alihakemistoihin.

Widgetien kanssa työskentelyn ominaisuudet

Suurin ero muista saman tarkoituksen kirjastoista on, että kaikki widgetit luodaan yleensä staattisesti, kuten tavalliset luokan jäsenmuuttujat (vaikka myös kyky luoda widgetejä dynaamisesti säilyy). Reaali- ja kokonaislukuja varten on olemassa erityisiä syöttökenttiä. Esimerkiksi laskimen ikkunan widgetit voidaan kuvata seuraavasti:

class MyWindow : public TopWindow { julkinen : EditDouble arvo1 , arvo2 ; // Operandien syöttökentät Label l1 , l2 ; // Syöttökenttien nimet DropList- toiminto ; // Toimintojen pudotusvalikko Label l3 ; // Luettelon nimike Button compute ; // Laske-painike Merkitse tulos ; // Tuloksen etiketti

Sitten kun sijoitat widgetejä manuaalisesti, meidän on sijoitettava ne ohjelmaikkunaan funktion avulla Add(widget)(katso esimerkki sen käytöstä kohdasta Hello World ).

Itse asiassa widget-tukiobjektit ovat olemassa dynaamisessa muistissa, mutta ne ovat piilossa laajuudelta ja luodaan ja tuhoutuvat automaattisesti, toimimme vain niiden staattisten "kääreiden" kanssa. Näin pääset eroon manuaalisesta muistinhallinnasta, et voi enää järjestää muistivuotoa unohtamalla kirjoittaa delete . On hyvä käytäntö ohjelmoida Ultimate++:lla, jotta resurssien hallintaan ei koskaan käytetä osoittimia. Vaihtelevan kokoisten tai polymorfisten tietojoukkojen hallintaan käytetään NTL-säiliöitä. NTL:ssä ei ole "älykkäitä osoittimia" (kuten boost ::shared_ptr ), niitä ei tarvita ja niitä pidetään huonona käytäntönä. Tämä C++:n muistinhallinnan lähestymistapa on osoittautunut hyvin, sillä se on käytännössä yhtä suuri kuin roskien kerääminen käytettävyyden suhteen ja ylittää sen suorituskyvyn ja ohjelman deterministisen toiminnan suhteen.

Jokaisella U++-widgetillä on jokin "luonnollinen" merkitys. Syöttökentässä arvo on siis syötetty teksti, listalle - valittu elementti, painikkeelle - sen painamisen toimintokäsittelijä. ~widget - operaattoria (palauttaa muunnelman tyypin arvon Value) käytetään widgetin arvon saamiseen ja widgetin <<= arvooperaattoria käytetään sen asettamiseen . Jos haluat asettaa widgetin, kuten painikkeen, arvon käsittelijäfunktiolle, sinun on "kierrettävä" nimi tai vastaavasti. luokan jäsenfunktio makroksi THISBACK().

Useimmissa GUI-kirjastoissa, kuten Qt , jokainen widget pitää luettelon osoittimista sen lapsiin, eli widget-hierarkia on widgeti-ilmentymien ominaisuus, eikä se riipu järjestyksessä, jossa ne on määritelty luokan rungossa. Ultimate++:ssa hierarkia määritellään kuitenkin vain luokkatasolla - jokainen muita widgetejä sisältävä kontti-widget määritellään luokaksi, jonka jäseniä ovat kaikki sisäkkäiset widgetit.

Asettelueditorin käyttäminen

Widgetien manuaaliselle sijoittamiselle ikkunan rakentajaan on vaihtoehto - visuaalinen asettelueditori (Layout Editor). Siinä luodut asettelut ovat C++-oikeita, sisältävät tiedostoja, jotka käyttävät erikoismakroja ja joiden tunniste on .lay . Jotta voisimme työskennellä asettelujen kanssa, meidän on sisällytettävä lay.h-otsikkokirjasto C++-tiedostoomme, joka sisältää automaattisesti asettelutiedoston, joka on määritetty käyttämällä #define LAYOUTFILE.

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

Jos asettelua kutsutaan esimerkiksi main , niin liitäksesi sen pääohjelman ikkunan luokkaan, sinun on määritettävä se

class MyWindow : public Withmain < TopWindow > {

jossa Withmain on malliluokka, jonka lay.h-makrot luovat automaattisesti lay-tiedoston perusteella. Se käyttää mallia yksinkertaisen luokan tai rakenteen sijaan, joten voit käyttää mitä tahansa widgetiä perusluokkana, ei vain valintaikkunaa ( TopWindow ).

Jos haluat järjestää ikkuna-widgetit asettelun mukaan, sinun on lisättävä tiedoston rakentajan alkuun kutsu

CtrlLayout ( * tämä );

Tämä lähestymistapa visuaalisen käyttöliittymän muokkaamiseen mahdollistaa linkkitiedostojen staattisen kääntämisen sen sijaan, että niitä tulkittaisiin ajon aikana, kuten monet GUI-työkalut tekevät, mikä parantaa Ultimate++:ssa luotujen sovellusten suorituskykyä.

Asettelueditori ei kuitenkaan ole täydellinen visuaalisen käyttöliittymän editori, kuten QtDesigner tai Glade . Sen avulla voit asettaa vain saman hierarkiatason widgetien nimet ja suhteelliset paikat. Kaikki widgetien ominaisuudet (paitsi yksinkertaisimmat, kuten painikkeen kirjoitus) ja niiden vuorovaikutuksen logiikka kirjoitetaan ohjelmakoodiin.

Esimerkkejä

Vähimmäishakemus

#include <CtrlLib/CtrlLib.h> käyttäen nimiavaruutta Upp ; GUI_APP_MAIN { }

Ikkunan luominen

#include <CtrlLib/CtrlLib.h> käyttäen nimiavaruutta Upp ; class MyWindow : public TopWindow { julkinen : Oma ikkuna () { otsikko ( "Hei maailma!" ); MinimizeBox (); MaximizeBox (); Suuri (); SetRect ( 0 , 0 , 300 , 300 ); } }; GUI_APP_MAIN { Oma ikkuna (). juosta (); }

hei maailma

Seuraava esimerkki luo (ilman visuaalista editoria) sovelluksen, jossa on "HelloWorld"-painike.

#include <CtrlLib/CtrlLib.h> käyttäen nimiavaruutta Upp ; class MyApp : julkinen TopWindow { typedef MyApp LUOKAN NIMI ; julkinen : OmaApp () { otsikko ( "hei maailma" ); -painiketta . SetLabel ( "Hei maailma!" ); painike <<= THISBACK ( Napsauta ); Lisää ( painike . HSizePos ( 100 , 100 ). VSizePos ( 100 , 100 )); } yksityinen : void Click () { if ( PromptYesNo ( "Painiketta klikattiin. Haluatko lopettaa?" )) tauko (); } Painikepainike ; _ }; GUI_APP_MAIN { myApp (). juosta (); }

Monimutkaisempi esimerkki

Virallisen sivuston Vertailut -osiossa voit löytää esimerkkejä melko monimutkaisen lomakkeen luomisesta U++:ssa ja verrata sitä vastaavien toimintojen toteuttamiseen Qt :ssä , wxWidgetsissä ja Java / Swingissä .

Muistiinpanot

  1. Työskentely Android Builderin kanssa . Haettu 22. joulukuuta 2019. Arkistoitu alkuperäisestä 22. joulukuuta 2019.

Linkit