Deschideti manualele la pg 61 (editia de buzunar), vom citi si comenta impreuna paginile acestui capitol (sau recapitula):
In esenta in primul paragraf sunteti invitati sa cunoasteti (sau sa va reamintiti) doua notiuni fundamentale, aparute atunci cand s-a trecut de la aplicatiile DOS la cele din sistemele multiuser-multitasking. Si multifereastra: Callback si eveniment.
Eveniment este in esenta ceva ce se intampla in mediul exterior programului, un click de mouse, o apasare pe tasta, un miscat de mobil (acceleratorul e senzorul folosit), un semnal de la ceas, samd, deci ceva ce determina programul
sa execute ceva.
Aici incepe o discutie:
A)Evenimente tratate a la Visual Basic
Limbajele vizuale ca Visual Basic, Gambas si altele similare au caracteristicile:
1) Codul de executat este parte din program
2) Codul de executat este asociat direct perechii widget (sau control) + eveniment.
Legatura este directa, nu am posibilitatea ca widget-ul (sau controlul) care suporta click-ul sa trimita si la alta subrutina fluxul executiei.
Designerul visual de la Qt functioneaza cam la fel: Observati in exemplul anterior, cel cu coronavirusul, cum actioneaza butonul Inchide ! Se apeleaza metoda corespunzatoare on_pushButton_clicked() in care am pus instructiunile de iesire.
B)Legaturi dintre sloturi si semnale
Qt are o abordare revolutionara si multiplatforma. Exista un fel de "prelungitor" prin care pleaca SEMNAL-ul care va pune in functiune subrutina. Imaginati-va niste pompieri care au o sursa de apa undeva , un foc de "executat" pardon de stins si o sursa de apa (are o forma specifica) de unde curg metrii cubi de apa. Acestea sunt pe post de semnal.
Ce face pompierul: Conecteaza sursa de apa prin furtun cu locul incendiului, acolo unde se va intampla ce trebuie sa se intample.
Ce face programatorul Qt ? Conecteaza obiectul care emite SIGNAl (adica semnalul) cu locul unde este de efectuat "stingerea incendiului", actiunea. Aceasta este o banala metoda a unei calse de obiecte dar este declarata cu un nume special: SLOT.
Insa in declaratia de clasa se scrie slot cu minuscule.
[Tehnic vorbind SIGNAL si SLOT un fel de macrouri iar preprocesorul Qt-ului creaza un cod diferit de la o platforma la alta, bazat pe C++ si ceva numit metaobiecte. Nu discutam despre ele, oricum prezenta lor e practic transparenta.]
conexiunea se scrie:acesta
connect(adresa_obiect_emitator, SIGNAL(nume_semnal()),
adresa_obiect_receptor, SLOT(metoda_slot()).
Este posibila si conexiunea prin care se transmite nudoar semnalul ci si o valoare care va fi prelucrata.
conexiunea se scrie:
connect(adresa_obiect_emitator, SIGNAL(nume_semnal(parametru)),
adresa_obiect_receptor, SLOT(metoda_slot(parametru)).
Callback-ul este altceva, este o subrutina pe care o scriem noi si o indicam unui alt api, de exemplu OpenGL-ului, iar acesta o va apela atunci cand are nevoie. Cazul clasic este subrutina de afisare aunui joc video, ea trebuie scrisa de programator dar apelata de sistem.
Voi presupune ca ati lucrat cu succes lucrarea de lab din cap al 5-lea.
Continuam ... dupa pauza.
Capitolul al 6 -elea [pg75 editia de buzunar]
In acest capitol folosim clasa de obiecte din capitolul anterior pentru a crea un veritabil panou de control cu mai multe indicatoare si mai multe slidere.
Creati un proiect nou in Qt creator, varianta de proiect non vizual, Empty Project:
Apoi dati-i un nume sugestiv:
Terminati cu Next, Next...
Editati fisierul .pro (Qt 5, doar, nu si Qt 4).
Si haideti sa scriem codul exemplului ca o singura sursa C++, deocamdata:
Fisierul numiti-l main.cpp.
Acum sa scriem in fisier codul intregului exemplu care va contine in esenta un program care creaza intr-o bucla mai multe obiecte din clasa noastra anterioara, de acelea cu Afisaj LCD , buton si conexiune.
Adaugati intai declaratiile claselor necesare:

Adaugam si functia main care va crea intregul obiect principal.
Cu ajutorul lor se va crea, in constructorul clasei MyWidget, obiectl principal.
Deci introducem in proiect o noua clasa: LCDRange (unii vor recunoaste in acest proiect o varianta a unui mai vechi proiect Qt3, unde clasa aceasta a mai fost folosita - deh asa fac limbajele de P.O.O reutilizarea codului.)
Aceasta clasa va fi un aderivata din QWidget, precizati, fiind tot un fel de QWidget dar de-al nostru:
Si acum Qt Creator va crea cele doua fisiere ale clasei, header-ul si sursa, pe care le vom completa, plecand de aici:
Aici va fi declaratia, deschideti dosarul Headers la lcdange.h:
Vom completa aceasta clasa, remarcati ca are un constructor, o tratare a evenimentului resizeEvent si doua obiecte (cele care apar in fereastra calsei, indicate de pointeri) lcd si sBar.
Aici va fi implementarea:
Iata implementarea:
Si puteti testa clasa scrisa mai inainte folosind aceasta functie main: (Ceeaa ce va rezulta seamana cu ceea ce ati facut la o lucrare anterioara, cand ati separat clasa de proiect):
Veti obtine, fireste, fereastra la care v-ati asteptat (arata ca data trecuta:
Pauza... dupa pauza scriem programul principal, adica clasa ferestrei MyWindow:
Acum sa continuam:
Ne ocupam de clasa ferestrei principale, MyWindow, accea a carui nume aparea in prima versiune a functiei main, pentru simplitate o vom include cu tot cu declaratii in main.cpp, urmand sa aveti ca sarcaina sa plasati acest cod in fisiere separate:
Incepem sa scriem in main.cpp, declaratia de clasa:
Obserrvati ca in noua fereastra (de tip QWidget, adica dreptunghi gri fara nimic) avem un QPushButton si 16 afisaje.
Apropos: Aplicatia va arata asa:
Acum adaugam implementarea clasei , a se citi cu mare atentie !
Exercitiu de intelegere: Implementarea de mai sus va "propun" sa o studiati pentru a intelege numar cu numar cum a fost facuta !
Intrebare de control: Care din obiectele din imagine e creat primul , si cu ce instructiune !
Intrebare de control: Cum sunt create cele 16 obiecte ?
a) care parte din cod le creaza ?
b) matricea lor este indexata cum ?
b1) de la 1 la 16 ?
b2) cu doua bucle de la 1 la 4 ?
Alegeti!
Intrebare de control: valueWith este latimea unui obiect compus LCDRange, din cele 16 cu sau fara spatiul dintre ele ?
Intrebare de control: valueHeight este inaltimea unui obiect compus LCDRange, din cele 16 cu sau fara spatiul dintre ele ?
Intrebare de control: Daca impart numerele i de la 1 la 16 si obtin: i%4 si i/4 care este ...?
a) numarul liniei in matricea de 4x4 obiecte ?
b) numarul coloanei in matricea de 4x4 obiecte
Intrebare de control: La ce serveste setGeometry(...) pentru un Widget ?
Acum punem la punct functia main() astfel incat sa creeze o fereastra MyWidget:
Si aplicatia va rula asa, prezentand panoul de control si ilustrand felul cum puteti refolosi o clasa in mai multe locuri dintr-o aplicatie.
End... dar nu uitati sa implementati vizual exemplul cu calculul numarului de cazuri de coronavirus, e pe o pagina separata.
Sfarsit cap 6.
Niciun comentariu:
Trimiteți un comentariu