Program s grafičkim sučeljem. Izrada grafičkog sučelja pomoću Qt-a. Izrada sučelja iz C# koda

1.1. Pozdrav Qt!

Zadržite pokazivač ispod teksta najjednostavnijeg Qt programa:

1 #uključi 2 #uključi 3 int main(int argc, char *argv) 4 ( 5 QApplication app(argc, argv); 6 QLabel *label = new QLabel("Hello, Qt!", 0); 7 app.setMainWidget(label); 8 label ->show(); 9 return app.exec(); 10 ) Ovdje su u redovima 1 i 2 uključene klase QApplication i QLabel.

U retku 5 kreira se instanca klase QApplication kojom upravljaju resursi programa. Konstruktoru QApplication prosljeđuju se argumenti argc i argv, Qt ljuske mogu obraditi argumente naredbenog retka.

Redak 6 stvara QLabel vizualnu komponentu koja prikazuje "Hello, Qt!". U Qt terminologiji nazivaju se sve vizualne komponente koje će imati grafičko sučelje widgeti(Widgeti). Gumbi, izbornici, vrtlozi za pomicanje i razni okviri – sve su to widgeti. Neki widgeti se mogu koristiti u vlastitim widgetima, na primjer, smutty programi - najočitiji widget, koji mogu koristiti QMenuBar, QToolBar, QStatusBar i drugi. null) indikator koji vam govori da ovaj widget nema "ravnalo". nemojte se prijavljivati ​​s drugim widgetom.

U retku 7 dodijeljen je widget "head" programa. Ako korisnik zatvori "glavni" widget programa (na primjer, pritisnem gumb "X" na naslovu prozora), program dovršava svoj rad. Ako program ne prepozna glavni widget, nastavit će čekati pozadinski način rada nakon zatvaranja prozora.

U 8. redu vidljiva je oznaka. Widgeti su uvijek nevidljivi, tako da je programer lišen mogućnosti podešavanja parametara prikaza prije nego smrad postane vidljiv.

U retku 9 onemogućen je prijenos Qt biblioteke. Od tog trenutka program će se prebaciti u način prepoznavanja, ako ništa ne učinite, već jednostavno provjerite na kotačiću, na primjer, pritiskom na tipku ili tipku miša.

Be-yaka diya koristuvacha spawn podij(drugim riječima - "napredovanje"), u slučaju programa, možete kliknuti jednu ili više funkcija. U tom smislu, dodaci s grafičkim sučeljem radikalno se modificiraju u različitim programima, sa skupnom obradom podataka, kao što su prihvatili unos kao korisnik, samostalno obrađuju jogu, vide rezultate i dovršavaju svoj posao bez daljnjeg sudjelovanja narod.

Beba 1.1. Vikno programi za Windows XP


Sada je vrijeme da ponovno napišemo robota našeg programa. Prije svega - potrebno je da imate instaliran Qt 3.2 (ili novu verziju), te promjenu PATH putanje do bin direktorija. (Za Windows, postavka promijenjenog PATH-a automatski je onemogućena tijekom instalacije Qt biblioteke)

Kopirajte tekst programa iz datoteke, s imenom hello.cpp, iz direktorija hello.

Dođite do drugog direktorija i izdajte naredbu:

Qmake -project za stvaranje datoteke projekta neovisne o platformi (hello.pro), a zatim dajte sljedeću naredbu: qmake hello.pro Ova naredba će stvoriti Makefile na temelju datoteke projekta. Dajte naredbu make za prevođenje programa, a zatim pokrenite ju upisivanjem zdravo(na Windowsima) ili ./zdravo(za Unix) ili otvori hello.app(Mac OS X). Ako radite u sustavu Windows i koristite Microsoft Visual C++, trebali biste zamijeniti naredbu make i izdati naredbu nmake. Kao alternativu, možete kreirati projekt Visual Studio iz datoteke hello.pro pokretanjem naredbe: qmake -tp vc hello.pro i zatim prevesti program u Visual Studio.

Beba 1.2. Oznaka s formatiranim tekstom.


A sad raščlanimo troh. Promijenili smo izgled natpisa, dodajući formatiranje teksta u HTML stilu. Za koga, zamijeni red

QLabel *label = new QLabel("Zdravo, Qt!", 0); na QLabel *oznaka = nova QLabel("

zdravo " "Qt!

", 0); i ponovno odaberite program.


1.2. Djelovanje signala.

Uvredljiva stražnjica pokazuje - kako organizirati reakciju programa na díí koristuvach. Tsya program za pritiskanje gumba, kada se pritisne na jaku, program se zatvara. Vanjski tekst već je sličan prednjem dijelu, zbog činjenice da sada, kao glavni widget, QLabel zamjenjuje QPushButton i dodatni kod, koji služi kao činjenica napada.

Beba 1.3. Zatvori program.


1 #uključi 2 #uključi 3 int main(int argc, char *argv) 4 ( 5 QApplication app(argc, argv); 6 QPushButton *button = new QPushButton("Quit", 0); 7 QObject::connect(button, SIGNAL(clicked() ), 8 &app, SLOT(quit())), 9 app.setMainWidget(button);10 button->show(); signale, govoreći jogo o onima koje je koristuvač učinio, bilo da je to djelo ili o onima koji će promijeniti svoj tabor. Na primjer, instanca klase QPushButton šalje programu clicked() signal kada se gumb pritisne. Signal se može "povezati" s funkcijskim rukovateljem (takvi Qt rukovatelji se nazivaju utori). Na taj način, ako widget nadjača signal, utor se automatski poziva. Aplikacije su spojile signal clicked(), poput gumba, na quit() utor, instancu klase QApplication. Wikiji SIGNAL() i SLOT() su makro-signali, o njima ćemo izvijestiti u sljedećem odjeljku.

Sada uzmimo program. Pretpostavljam da ste već stvorili quit direktorij i distribuirali datoteku quit.cpp. Daj naredbu qmake za izradu projektne datoteke, a onda odjednom - za izradu Makefile:

Qmake -project qmake quit.pro Sada izađite iz programa naredbom napraviti i započni jogu. Bilo da pritisnete tipku "Quit" ili pritisnete tipku "Proble" na tipkovnici, program završava svoj rad.

Na napadačkoj strani prikazano je kako je moguće osvojiti signale i utore za sinkronizaciju dva widgeta. Tsya program proponuê koristuvacheví zaprovaditi svíy vík. To možete učiniti uz pomoć gumba za upravljanje ličnikom ili uz pomoć zujalice.

Beba 1.4. Dobni program.


Dodajte tri widgeta: QSpinBox, QSlider i QHBox (horizontalno područje izgleda). Glavni widget programa je QHBox. Komponente QSpinBoxa i QSlidera smještene u sredini QHBoxa i ê popustljiv , Odnedavno.

Beba 1.5. Widgeti za dob.


1 #uključi 2 #uključi 3 #uključi 4 #uključi 5 int main(int argc, char *argv) 6 ( 7 QApplication app(argc, argv); 8 QHBox *hbox = new QHBox(0); 9 hbox->setCaption("Unesite svoju dob"); 10 hbox-> setMargin(6); 11 hbox->setSpacing(6); 12 QSpinBox *spinBox=novo QSpinBox(hbox); 13 QSlider *slider=novo); 15 klizač->setRange(0, 130); 16 QObject::connect(spinBox, SIGNAL(valueChanged(int)), 17 klizač, SLOT(setValue(int))); (valueChanged(int)), 19 spinBox, SLOT(setValue(int))), 20 spinBox->setValue(35); 21 app.setMainWidget(hbox); 22 hbox->show(); 23 return app.exec( );24) Redovi od 8 do 11 stvaraju i zatvaraju QHBox. Za unos teksta u naslov prozora, pozovite setCaption(). Zatim ćemo vratiti prazan prostor (6 piksela) pokraj onog između odgovarajućih widgeta.

U redovima 12 i 13 kreiraju se QSpinBox i QSlider, a QHBox se dodjeljuje kao Vlasnik.

Ne čudeći se onima koji nisu eksplicitno postavili ni položaj ni ekspanziju QSpinBox i QSlider widgeta, smrad se uredno rasporedio po sredini QHBoxa. Vlasne za tsgogo i imenovanja QHBox. Vín vykonuê automatski postavlja odgovarajuće widgete, dodjeljujući im koordinate položaja i lokacije, ugar u víd í̈khníh mogao bi to vlaštuvan. Qt ima dosta klasa, sličnih QHBoxu, koje nam pomažu u rutinskom radu s ručnim podešavanjem položaja i mijenjanjem veličine vizualnih komponenti.

U redovima 14 i 15 ugrađene su dopuštene izmjene ličnika i mijeha. (Sa sigurnošću možemo priznati da je malo vjerojatno da bi naša stenografija mogla prestići 130 godina.) Dva connect() wikija, u redovima od 16 do 19, sinkroniziraju zastavu imena, pa zašto bi smrad uvijek imao isto značenje. Svaki put kada se promijeni vrijednost jednog od widgeta, on šalje signal valueChanged(int) da odgovara utoru setValue(int) drugog widgeta.

U 20. redu instalirana je primarna vrijednost (35) ličnika. Kada se proslijedi, varijabla nadjačava signal valueChanged(int) , na temelju vrijednosti ulaznog argumenta, jednakog 35. Broj se prosljeđuje u setValue(int) utor widgeta QSlider, koji postavlja vrijednost widget jednak 35. Ako je signal valueChanged već poslan, QSlider Neke od njegovih vrijednosti su se dramatično promijenile, pozivajući setValue(int) utor na QSpinBox widget na ovaj način. Prvi put ličilnik nije poslao signal, krhotine njegovog značenja i tako ih je bilo 35. Na taj je način spašena rekurzivna rekurzija. Malyunok 1.6 ilustrira situaciju.

Beba 1.6. Promjena jednog značenja zahtijeva promjenu drugog.


U nizu od 22 QHBoxa pokušajte biti vidljivi (istovremeno uz pomoć widgeta).

Pristup oblikovanju Qt sučelja još je jednostavniji za razumijevanje i izvanredno fleksibilan. Na divlji način, programer odabire potrebne widgete, postavljajući ih u sredinu područja izgleda (izglede), kao iz vlastite linije kako bi preuzeo vezivanje rasporeda widgeta i snagu widgeta. U završnoj fazi uspostavljaju se međusobne veze widgeta, kroz mehanizam signala i utora, kao da ozvučavaju ponašanje sučelja zvučnika.

1.3. Robot iz naprednog sustava.

Dovidkov sustav Qt - možda najvažniji alat svakog trgovca. Vaughn opisuje sve funkcije klase ove knjižnice. (Dokumentacija za Qt 3.2 uključuje opise više od 400 klasa i 6000 funkcija.) Ova knjiga ima puno Qt klasa i funkcija, ali je daleko od iscrpne. Stoga je potrebno da se samostalno upoznate s naprednim Qt sustavom.

Stilovi widgeta
Screenshots, yakí mi bachili, buli otrimani u Windows XP. Međutim, trenutni izgled widgeta mijenja se ovisno o platformi na kojoj je program pokrenut. S druge strane, Qt može oponašati stari izgled bilo koje prateće platforme.



U ovom članku postoji opis stvaranja najjednostavnijih dodataka iz najčešćih oblika mog C ++. Želio bih pojasniti: razvoj C ++ dodataka "forme" bit će uveden u Microsoft Visual Studio (vidjet će ga glavni konkurent, Borland Software). Što znači da Visual Studio ima dva načina za izgradnju dodataka s formama, odluka se donosi u trenutku stvaranja novog projekta.

Prvi od njih je Windows Forms, koji implementira grafičko sučelje i kompatibilan je s Microsoft.NET Frameworkom. Ovaj će vam vodič omogućiti pristup elementima sučelja sustava Microsoft Windows i stvaranje Win32 API omotača u kodu kernela. Da bi se misli izrazile u razumnijem obliku, onda je danski pidkhid još sličniji post-konzolnom dodatku, ali malo presavijeniji. vikoristički oblik.

Drugi način baziranja na Microsoft Foundation Classes (MFC), knjižnicama, jest preuzimanje zadatka stvaranja okvira programa. Prije svega, MFC out-of-the-box vicorist uzorak MVC (Model-View-Cont roller). Denmark je sklopiviji od prvog, ali spiralnim prelaskom na novi možete jednostavno stvoriti okvir za razne dodatke, na primjer, uređivač teksta, ili okrenuti komponentu Ribbon i stvoriti izbornik kao što vidite MS Office 2010 .

Izrada programa u MS Visual Studiju

Kreirajmo novi program: File->New->Project. Na prvi pogled trebali biste saznati i odabrati Windows Forms Application, dati naziv (app1) i odobriti novi projekt te potvrditi svoju izradu pritiskom na tipku “OK”.

Prije svega, rozpochat bez posredničkog programiranja, zatim shvatite koji je način. Podiya tse diya, scho vídbuvaêtsya za pjevanje umova. Najjednostavnije (i najšire) koje možete koristiti Load, Click ... pogledajmo neke od njih:

  • Aktivirano - podija, koja određuje sat aktivacije elementa.
  • Klik - krivi se za jedan klik na element.
  • DoubleClick - kliknite na element.
  • HelpRequested - pomoć pri pritisku tipke .
  • Boja - Vinicate ako se element ponovno boji.
  • MouseLeave - podíya spratsovuê, ako je pokazivač lijevo između elementa.

Ne zaboravite da bi element snage trebao ležati u ovoj vrsti. Da biste pregledali sve obrasce dostupne za objekt, trebali biste ga vidjeti i odabrati ikonu mjehurića u prozoru ovlaštenja. Ispod je djelomični pododjeljak za element Form1. Kako je moguće bachiti za potprogram Učitaj, odabrana je funkcija Form1_Load, tako da će se kod koji je postavljen u ovu funkciju kliknuti kada se obrazac uhvati.

Otvorite datoteku Form1.h, bit će sljedeći kod:

Privatno: System::Void Form1_Load(System::Object^ pošiljatelj, System::EventArgs^ e)( )

Ovo je sama funkcija Form1_Load, jer radi kada je obrazac uhvaćen. Zamijenimo stvari dodavanjem TextBox komponente u obrazac.

Za koga, otvorite obrazac za resurse i pogledajte jogu. Zatim odaberite ploču Toolbox i povucite komponentu TextBox na obrazac. Izmijenite funkciju Form1_Load ovako:

Privatno: System::Void Form1_Load(System::Object^ pošiljatelj, System::EventArgs^ e) ( textBox1->Text = "Hello, World!"; //textBox1 je naziv teksta koji ste dodali u okvir)

Pokrenite projekt, rezultati mogu pokazati sljedeću obavijest:

Sve je za sada, nastavite u nadolazećim lekcijama.

Zadnja izmjena: 26.05.2019

Xamarin.Forms vizualno sučelje sastoji se od tri strane. Stranica je objekt klase Stranica, zauzima cijeli prostor na ekranu. Tobto oni koji su na ekranu mobilnog aneksa su ista strana. Program može imati jednu ili više strana.

Stranica obično prihvaća jedan od kontejnerskih izgleda, u kojem su standardni vizualni elementi poput gumba i tekstualnih polja, kao i drugi elementi izgleda, smješteni u svom rasponu.

Razmotrite kreacije mnogih tema, HelloApp projekt (inače stvaramo novi). Iza brave se kreira cijelo sučelje u App klasi koja se nalazi u datoteci App.xaml.cs i koja predstavlja tok programa:

Yogo kod za zaključavanje:

Korištenje sustava; koristeći Xamarin.Forms; koristeći Xamarin.Forms.Xaml; namespace HelloApp ( javna djelomična klasa App: Aplikacija ( javna aplikacija () ( InitializeComponent(); MainPage = new MainPage(); ) zaštićeno nadjačavanje void OnStart() ( // Rukovanje kada se vaša aplikacija pokrene ) zaštićeno nadjačavanje void OnSleep() ( / / Rukovanje kada vaša aplikacija spava ) protected override void OnResume() ( // Rukovanje kada vaša aplikacija nastavlja s radom ) ) )

Radnik klase App počinje s konstruktorom, poziva metodu InitializeComponent(), koja izvršava inicijalizaciju objekta, a zatim postavlja ovlaštenje MainPage. Kroz ovlaštenje App klase, glavna strana programa je instalirana. U ovom slučaju, dodijeljena mu je klasa HelloApp.MainPage, što je ista klasa koja je dodijeljena datotekama MainPage.xaml i MainPage.xaml.cs.

Alecey način nije samac. Xamarin.Forms vam omogućuje stvaranje vizualnog sučelja kako uz pomoć C # koda, tako i na deklarativan način uz pomoć xaml mov, slično html-u, ili ih možete kombinirati.

Izrada sučelja iz C# koda

Dodamo u HelloApp projekt s C# klasom pod nazivom StartPage.

í značajno u ovoj klasi takvo mjesto:

Korištenje Xamarin.Forms; namespace HelloApp ( class StartPage: ContentPage ( public StartPage() ( Label header = new Label() ( Text = "Hi Xamarin Forms" ); this.Content = header; ) ) )

Ova klasa predstavlja stranu koja spada pod klasu ContentPage. Konstruktor stvara oznaku s tekstom, jer je postavljen kao strana (this.Content = zaglavlje).

Da biste odredili glavnu stranicu kao početnu stranicu, promijenite klasu aplikacije:

Korištenje Xamarin.Forms; namespace HelloApp ( javna djelomična klasa App: Aplikacija ( javna aplikacija () ( InitializeComponent(); MainPage = new StartPage(); ) zaštićeno nadjačavanje void OnStart() ( // Rukovanje kada se vaša aplikacija pokrene ) zaštićeno nadjačavanje void OnSleep() ( / / Rukovanje kada vaša aplikacija spava ) protected override void OnResume() ( // Rukovanje kada vaša aplikacija nastavlja s radom ) ) )

Sada snaga glavne stranice ukazuje na pametno presavijenu stranu početne stranice.

To također znači da Visual Studio priprema predložak za dodavanje novih klasa strana s najjednostavnijim kodom. Dakle, da biste dodali novu stranicu, trebate odabrati predložak stranice sadržaja (C#) kada dodajete novi element:

Ova se klasa dodaje u glavni projekt rješenja (u slučaju HelloApp).

Dodajte sljedeći kod matičnog sata na strani razreda:

Korištenje sustava; vicorist System.Collections.Generic; koristeći System.Linq; vicorist System.Reflection.Emit; koristeći System.Text; koristeći Xamarin.Forms; imenski prostor HelloApp ( javna klasa Stranica1: Stranica sadržaja ( javna Stranica1() ( Sadržaj = Novi StackLayout ( Djeca = ( Nova oznaka ( Tekst = " Pozdravna stranica " ) ) ) ) ) )

Ova se klasa također razlikuje od osnovne klase ContentPage i praktički je iste organizacije kao i kreacije klase MainPage.

A u klasi programa ovu stranu također možete postaviti kao početnu:

Korištenje Xamarin.Forms; imenski prostor HelloApp ( javna djelomična klasa App: Aplikacija ( javna aplikacija () ( InitializeComponent(); MainPage = nova stranica1 (); ) //........... ) )

5

Napravio sam puno različitih verzija GUI sustava za Nintendo DS, kao što su gumbi, tekstualna polja i proporcije, ali također mi je trebao način da ove klase priložim jednoj klasi Guija, tako da mogu odmah nacrtajte sve odjednom na ekranu, i jednom okrenite sve gumbe, pa perevíriti, chi pritisnuti be-like gumbe. My food je najbolji način za organiziranje svih klasa (na primjer, gumba i tekstualnih polja) u jednu GUI klasu?

Os je jednosmjerna, kao što sam mislio, ali ne znam pravi:

Uredi: Ja sam pobjednički C++.

Class Gui ( public: void update_all(); void draw_all() const; int add_button(Button *button); // Vraća id gumba void remove_button(int button_id); private: Button *buttons; int num_buttons; )

Ovaj kod može imati nekoliko problema, ali samo vas želim obavijestiti o onima koje želim.

  • 5 koraka
  • Sortiranje:

    Aktivnost

2

Sadržaj je sličniji onima koje sam odlučio objaviti, samo što je moj prepoznat za programiranje Sony PSP-a.

Satima sam čeprkao okolo, konzultirao sam neke knjige i VTM-ove, i što treba i ne treba raditi o ideji jednostavnih korisničkih sustava.

Klasa uiElement() ( ... virtual void Update() = 0; virtual void Draw() = 0; ... ) klasa uiButton() public: uiElement ( ... virtual void Update(); virtual void Draw() ; ... ) klasa uiTextbox() public: uiElement ( ... virtual void Update(); virtual void Draw(); ... ) ... // Ostali ui elementi klasa uiWindow() ( ... void Ažuriranje (); void Draw(); void AddElement(uiElement *Element); void RemoveElement(uiElement *Element); std::list elementi; ... ) void uiWindow::Update() ( ... za (list ::iterator it = Elements.begin(); to! = Elementi.end(); it++) it->Update(); ... ) void uiWindow::Draw() ( ... za (list ::iterator it = Elements.begin(); to! = Elementi.end(); it++) it->Draw(); ...)

princip - stvaranje prozora i attak elemenata sučelja jezgre na novi, te poziv mališana i ažuriranje metoda najvažnijih osnovnih funkcija.

I dalje nemam što raditi, jer imam problema s kodom slikanja. Uz različite API-je na PC-u i PSP-u, pregledavam omotni kod za OpenGL i psp gu.

Nadam se pomoći.

0

Jedna ključna strategija, kao podsjetnik, možda složeni obrazac. Na nižoj razini možemo vam omogućiti lakšu obradu svih GUI objekata (tu kolekciju objekata) nakon što su stvoreni. Ali ne znam kakve veze ima s dizajnom GUI grafičkog sučelja, samo je to mjesto za saznati pravi smjer, izvorni kod za projekt. WxWidgets je višeplatformsko grafičko sučelje s dostupnim izlaznim kodom. Sretno s vašim projektom!

0

3

Za tiho, hto zatsíkavleniya, os my z vídkritim víhídnym kod, BSD-licencirani GUI alat za DS:

Dobro je izvijestiti o subject2k, ali ozbiljno bih preporučio matični kod da osveti elemente dječjeg sučelja u osnovnoj klasi uiElement. Tse srazok, za koji sam šivao na Vupsi.

Yakscho wi ne Nadogradite kod u osnovnoj klasi, zbog ozbiljnih problema prilikom pokušaja implementacije preklapanja, donjeg tekstualnog okvira i gumba. Na primjer:

  • Tabularne ploče mogu se modelirati kao hrpa gumba, grupiranih u jedan element sučelja koristuva, što osigurava međusobni vinyatkovist izbor;
  • Grupe radio postaja (sa satom);
  • Smogi pomicanje može se prikazati kao klizač/element žlijeba i tipke gore/dolje;
  • Popisi koji se mogu pomicati mogu se prikazati u prikazu spremnika, a elementi naljepnica u sučelju koristuvača.

Osim memorije za pohranu, DS može imati procesor s frekvencijom od 66 MHz i 4 MB RAM-a, koji se može koristiti i za spremanje vašeg programa i za preuzimanje (DS-diskovi se učitavaju u RAM prije pokretanja). Vi ste zapravo krivi što gledate kako je sustav izgrađen, što znači da STL ne radi. Preuzeo sam STL s Woopsija i uštedio 0,5 MB zumiranja. Ne tako bogato iza standarda poda, ali još uvijek 1/8 najpristupačnije DS memorije, spozhivaya STL-smíttya.

Cijeli proces pisanja sučelja korisnika prijavio sam na svom blogu:

Uključuje opis dvaju algoritama koje sam smislio za ponovno slikanje zaslona, ​​što je nezgodan dio stvaranja grafičkog sučelja (jedan samo dijeli pravokutnike uzbrdo i pamti vidljiva područja, a drugi je BSP vicorist stablo, koje je učinkovitiji i jednostavniji za razumijevanje), toscho d.

Windows 7