Salutare si bun venit la noua intalnire cu Qt-ul, programarea multiplatforma... si multimedia, abia la finalul seriei.
Sper ca aveti la indemana manualul introductiv despre Qt Creator, in format de buzunar sau in format B5, de la editura universitatii. Deschideti acest manual al capitolul al 7-lea. Veti primi de data aceasta pe e-mail un extras, dar atentie, din motive care tin de contractul cu editorul, nu va pot trimite e-book-ul complet, ci doar un fragment de draft.
Presupunand ca ati primit cartea... Acum deschideti cartea la C7, capitolul al 7-lea.
Cititi paragraful I, pg 91.
Care este chestiunea zilei: Clasele de obiecte C++ traditionale, aveau o sintaxa mai simpla:
class MyOwnClass
{
public:
.... aici declaratii de date si metode ...
private:
.... aici declaratii de date si metode ...
protected:
.... aici declaratii de date si metode ...
}
Eventual mai aveau la inceput, pe primul rand o specificatie de unde mostenesc
care incepeaa cu doua puncte:
: ClasaDinCareMostenesc
Asa ca aratau cam asa:
class MyOwnClass : ClasaDinCareMostenesc
{
public:
.... aici declaratii de date si metode ...
private:
.... aici declaratii de date si metode ...
protected:
.... aici declaratii de date si metode ...
}
Desspre public, private,protected ati invatat in anii precedenti, pe scurt public este ceva accesibil altor obiecte sio altor functii din program, olicine, orice poate apela asa ceva sau actualiza asa ceva.
Private sunt date interne ale obiectelor clasei, cum sunt cutitele si cratitele bucatarului de la restaurant, plus retetele lui (algoritmii) de uz intern, (totul).
Clientii din afara nu vad asa ceva.
Protected este un fel de private dar care se vede din clasele derivate.
Uneori clasele derivate au nevoie de acces la asa metode sau date de uz intern, ca sa faca noile treburi de uz intern.
Nu comentez despre mostenire, publica, privata,protejata. Ea da maximul de drepturi de acces posibile, dar nu le escaladeaza pe cele existente.
Ati vazut insa ca clasele Qt, fiind scrise intr-o extensie C++ au si alte declaratii incluse, printre care acele fantastice sloturi si semnale.
Cititi paragraful al doilea, pg 91. Ok ?
Cititi paragraful al treilea, pg 91. Ok ?
Dati pagina la pagina 92.
Aici ne reamintim cum sa rulam o aplicatie incapatanata, care are probleme la compilare dar codul ii este corect: Clean ; Run QMake, ReBuild.
Amintiti-va cum se adauga o clasa noua C++ la un proiect Qt: File -> NewFile or Progect -> C++ -> C++ class.
Exercitiu: Jucati-va putin cu vrajitorul de adaugare a claselor si observati ce intrebari mai pune.
Atentie: Clasa de baza din care derivam noile noastre clase este f. importanta.
De la ea mostenim multe, inclusiv sloturi si semnale.
Sa citim impreuna pg 93.
Cateva explicatii sunt necesare:
a) Ce (naiba ?!? - neacademic) este Q_OBJECT ? Cititi paragraful a) pg 93 pt raspuns.
Notati ca aveti nevoie de acest Q_OBJECT in declaratia de clasa cand folositi sloturi si semnale !
Intrebare de control: Q_OBJECT nu are ; dupa el ca o instructiune.
b) Signals ... cititi la pg 93 ce sunt semnalele, paragraful b).
Atentie: Desi un semnal seamana ca sintaxa, ca mod de scriere cu un apel de functie fara parametru sau cu un parametru, e doar un apel de functie fara bloc {} fara acolada cu cod !
transmiterea unui semnal la un slot e mai curand asa ceva:
Semnalul Slotul
f() ---------> g()
{
..... cod de executat cand vine semnalul ....
}
Nu va imaginati ca semnalul are cod!
Atentie: Numele semnalului trebuie scris corect, din prima, fiindca compilatorul de C++ nu il verifica, semnalele sunt o extensie C++.
Totusi daca un nume de semnal este scris incorect, veti avea parte de erori la executie.
Cititi avertismentul de la pagina 93 si paragraful c) pg 94.
Intrebare de control: de unde vine denumirea de slot, si ce de la Qt, face ca aceste "chestii" Qt sa se numeasca tot "slot-uri" ?
Dupa pauza trecem la:
Aplicatie, la partea qt-nonvisual:
Pregatiti-va de lucru: Faceti o copie a folderului qt-nonvisual-C6 de saptamana trecuta si numiti-l qt-nonvisual-C7 la fel si cu fisierele .pro (sunt doua) din dosar, schimbati C6 cu C7 in numele lor.
Deschideti din QTCreator proiectul redenumit.
Ar trebui sa apara vechiul proiect ....
Schimbati si aici , in fisierul .pro, numele C6 cu numele C7.
Rulati aplicatia, care ar trebui sa arate ca saptamana trecuta. Cursoarele indicatoarelor din panoul de control se vor misca separat.
Exercitiu: Daca pe bara de sus a ferestrei apare... Qt6 Ex6 , desi ati modificat fisierul .pro, ce aveti de facut pt a rula applicatia in noua forma ?
Indicatia : ... este mai sus pe pagina ^.
Observati acum clasa LCDRange.h , asa cum e declarata in fisierul header.

Nu are sloturi si semnale, dar vom adauga noi, astfel incat clasa sa aiba (minimal) si un slot si un semnal.
Slot Semnal
________________
-------> | Clasa | -------------->
------------------------
Astfel, mai multe asemenea indicatoare din panoul de control pot fi puse sa isi trimita o informatie de la unul la altul, legandu-le in serie. Fiecare din serie va propagasemnalul de la un obiect la altul. In final, cand veti misca cursorul de la unul din "controale", modificarea se va propaga la celelalte. Acesta e scopul lucrarii practice.
Slot Semnal Slot Semnal
________________ ________________
-------> | Clasa | ------------------------> | Clasa | -------------->....
------------------------ ------------------------
Slot Semnal
________________
-------> | Clasa | -------------->
------------------------
Scopul aplicatiei noastre il gasiti la pg 94. Cititi paragraful si atentionarea.
Haideti sa completam clasa, adaugati un slot pe post de "set-er", adica e o metoda de setare a unor valori in obiectele clasei.
public slots:
void setValue(int);
Adaugati semnalele: Atentie, se scriu la plural si semnalele si sloturile !!!
signals:
voidValueChanged(int);
Amuzant: Puteti compila dar nu se intampla nimic nou, explicati de ce nu avem erori ! Ruleaz ca mai inainte ! Rulati !
Acum adaugati macroul Q_OBJECT
Si functia publica value(). Sa fie si ea acolo pt a accesa, ca la teoria POO, datele via unor metode.
Intrebare de control:
Ce fel de functie este value()
a) set-er
b) get-erInca ceva: promiteam solutia la problema cu Widget-ul care se roteste ! Vine si ea!
Acum verificati si implementarea clasei:
Si dati la pagina 100, Unde gasiti fisierul principal al proiectului.
Este momentul sa conectam fiecare afisaj cu bara, cat ai numara de la 0 ... la 16, ei bine, fiecare cu precedentul:
if (i>0)
connect(value[i], SIGNAL(valueChanged(int)),
value[i-1], SLOT(setValue(int)));
Atentie la scrierea sloturilor si semnalelor... se poate gresi, observati cum semnaleaza Qt un slot sau un semnal cu nume gresit la executie:
Corectati: ValueChanged() -> valueChanged(). Si observati mesajele cu rosu care apar in caz de nepotrivire, la executie!!
Bifurcarea semnalului: La pagina 99 mai este un connect aparte pe care nu trebuie sa il uitati, rolul sau este sa faca ca atunci cand pe mica conexiune dintre afisaj si bara de scroll circula un semnal cu o valoare, atunci sa se genereze si un semnal mai departe.
Cumva chestia este asa :
bara de scroll --------> afisajul LCD
|
|
\/
Semnalul care pe aici iese inafara obiectului. Astfel intregul ansamblu EMITE un semnal inafara, acela care se va propaga.
Ce am invatat acum:
O noua forma de conexiune: Conexiunea semnal semnal.
Are o sintaxa mai simpla, a se vedea randul albastru de mai sus. Un semnal al unui obiect interior este scos inafara. Sau daca vreti, un semnal de undeva de la un obiect genereaza un alt semnal.
Vom vedea si alte metode de a genera semnale!
Aplicatia ruleaza asa cum vedeti in imagine. Miscand butonul unei bare de scroll, obtineti efecte pe toate afisajele.
QDebug
Am spus in titlu ca explic ce este QDebug. Ceva folosit in Qt pentru a da mesaje de debugging cu operatorii clasici << de la stream-uri. Aceia de-i invatarati cu ocazia studiului lui <iostream>
Pe scurt:
Includeti:
#include <QDebug>
Si folositi in program:
qDebug() << "x=" << x ;
pentru a vedea valoarea variabilei x, din IDE. Apare in fereastra de jos.
Iata cum am facut debuggingul valorii value, primita de functia de setare a valorii: setValue().
END (cursul!)
Pentru laborator mergem pe o pagina noua.
Aceasta,care corespunzatoare cursului C8 dupa capitolul de carte C7 este inchisa.
Niciun comentariu:
Trimiteți un comentariu