joi, 7 mai 2020

Qt - Saptamana a 12-a - Cap 11


Buna ziua si bun venit la o noua intalnire cu Qt-ul

Va rog sa deschideti manualele Introducere in C++ extins folosind Qt Creator la pagina 149, Cap 11.

Vreau sa multumesc cu aceasta ocazie domnului, actual, inginer M.I. care intrebandu-ma cum se scriu astfel de prohrame in Qt, m-a facut sa includ si aceasta tema, in manual.

CHECKBOX-uri si RADIO BUTOANE 

In aceasta lectie vom construi un mic set de check-box-uri si radio-butoane,stiti ca se poate face acest lucru si cu designerul Visual, dar realizarea prin program non-vizual a unui astfel de set de controale pune unele probleme.



Intrebarea de control:
In imaginea de mai sus, care sunt check-box-uri, care sunt radio-butoane ?
a) Este check-box , "Am priceput" ?
b) Este check-box , patratul dinaintea textului "Am priceput" ?
c) Este check-box unul din acele cercuri din josul imaginii ?
d) Este check-box , "Click" ?

Indicatie: Radio butoanele au aceeasi eticheta !
V-ati prins ?  Cred ca stiati deja ! Dar v-ati (re)amintit ?

Intrebare de control:
Cum se numesc in Qt check-box-urile si radio-butoanele, mai exact clasele lor ?
a) CheckBox si RadioButton
b) QCheckBox si QRadioButton
c) QtCheckBox si QtRadioButton
d) QTCheckBox si QTRadioButton

Indicatie: Pai sunt din Qt si se scriu cat mai simplu. Deci ?

Cititi va rog paragraful de jos, [pg 149]. Sa-l citim impreuna ! Dati pagina, continuati cu pg 150. Intai primul paragraf.

Intrebare de control:
Care dintre aceste check-box-uri si radio butoane se aseamana mai mult cu un buton obisnuit ?
a) QCheckBox -ul
b) QRadioButton -ul

Citim mai departe.. pg 150.

Ce este important de aflat de aici ?
Ca exact ca si butoanele vechilor radiouri cu tranzistoare sau tuburi electronice, acelea cu calpe care se apasa, radio butoanele sunt prinse, puse impreuna in niste GRUPURI, si cand apesi un buton, celelate din grup devin neapasate.

Asta va pune o problema: Cum realizam grupurile in Qt ?

Dati pagina  la pg 151:

Intrebari de control:

Jos in imagine  aceasta  ^ sunt 6 radio butoane.
a) In cate grupuri sunt ele grupate ?
b) Puteti incercui fiecare grup pe imagine ?
c) Este o singura solutie de a foram grupuri ?
d) Sunt mai multe moduri de a forma grupuri ?
e) Indicati doua radio butoane care sigur nu sunt in acelasi grup !

Cititi paragraful din carte: pg 150. el raspund ela intrebarea cine sunt acele obiecte care permit sa grupam butoanele !

"Vestea bună: Îl cunoașteți deja pe acel cineva. Deoarece în Qt wid-
get-urile au o relație părinte – copil alta decât moștenirea obișnuită,
cel care va păstra informația că trei butoane sunt împreună este fie for-
ma, fereastra părinte, fie un obiect special numit chiar grup de butoa-
ne: QButtonGroup.
Într-un astfel de grup se pot adăuga butoane la
alegerea noastră, existând o metodă addButton() a obiectelor QBut-
tonGroup. Chiar dacă am creat șase butoane „la grămadă”, ulteror le
putem strânge sub umbrela a unu, două, sau mai multe grupuri. Gru-
purile vor funcționa ca părinți ai acestor butoane, în locul ferestrei
mari. Și la rândul lor vor avea ca părinte fereastra, deci în momentul
inserării lor între fereastră și butoane, le vom transmite că sunt fii unui
QObject aparte, ai ferestrei."

Ce este important de retinut:
1) Putem folosi mecanismul clasic de legatura intre Widget-urile Qt,
care face ca fiecare Widget sa aiba la creare un pointer catre un parinte al lui, nu in sens de mostenire.
2) Exista un QButtonGroup - care permite sa grupez butoane.
3) RadioButoanele se adauga cu metoda addButton(...).
4) Putem crea radio-butoanele dinainte si sa le adaugam pe urma in grupuri.

Ok, sa incepem proiectul: Dati la pagina  151.

IMPLEMENTAREA

Porniti Qt Creatorul si faceti un nou proiect, Empty qmake Project, nevizual:
L-am numit:qt-nonvisual-C11-qcheckbox-qradiobutton

Editati fisierul .pro si scrieti acolo (sub Linux, mai ales e important), cei care luicreaza cu Qt 4.6 Nokia pot sa sar aceasta etapa, dar fara ea codul nu va fi compatibil cu versiuni noi de Qt si cu Qt pt Linux.
Deci scrieti, minimal:

TEMPLATE = app
TARGET = Lectia11
QT += core gui
QT += widgets
SOURCES +=


Acum adaugam sursa main.cpp, din rubrica C++ source files, ati mai facut asta. Next, Finish.

Acum putem edita main.cpp:

Incepem cu bibliotecile in stil nou (Qt 5.9). Atentie la cei care lucreaza cu editii mai noi, bibliotecile se includ altfel, sunt cumva pe subdirectoare.

#include <QtGui>                            //CheckBox-uri și Radiobutoane
#include <QApplication>
#include <QCheckBox>                  // QT += widgets
#include <QRadioButton>

Intrebare de control:
Ce inseamna fiecare header, ce vrem sa includem scriindu-l ?

Adaugati pentru gruparea radio butoanelor:

#include <QButtonGroup>                // Capitolul 11
                                                            // – Cu grupuri de radio butoane

Deocamdata punem in main() codul care creaza cele doua check-box-uri si inchidem paranteza pentru a-l executa:

int main (int argc, char ** argv)
{
    QApplication a(argc,argv);
    QWidget window;
    window.setGeometry(10,10,300,160);
   
    QCheckBox checkBox(”A&m priceput!”, &window);
    // Nu uitati acest  parametru: &window
    checkBox.move(10,10);
   
    QCheckBox * checkBox2 = new QCheckBox(”C&ase sensitive!”, &window);
    checkBox2->move(10,40);
}
 si fiindca la executie nu apare nimic, pun intrebarea de control:

Intrebarea de control
Ce mai trebuie adaugat ?

Raspuns:
a)  Fiindca aplicatia nu afiseaza fereastra apelati: window.show();
b)  Iar ca butoanele sa fie active, porniti mecanismul de sloturi si semnale:
return a.exec();

Compilam din nou, si iata:


In imagine: Cele doua check-box-uri.
.
Puteti bifa si debifa check-box-urile !

Intrebare:
Si cum facem sa se intample ceva cand le bifam ? Au un semnal Clicked() ?

Solutie:
Puneti mouse-ul pe numele clasei Check-Box si apasati F1 sau FN+F1 (depinde de BIOS). veti obtine documentatia clasei checkbox, din care aflam ca exista si semanle care anunta schimabrea si care pot fi conectate cu ce ne intereseaza.

Intrebare:                                                               ^
Cum se numeste semnalul care indica schimbarea de stare a unui checkbox ?

Sa incercam o mica modificare:

Exercitiu:
Faceti al doilea CheckBox sa aiba eticheta Quit si sa opreasca aplicatia !

Solutie:
Adaugati in cod conexiunea de mai jos si schimbati numele checkbox-ului.:

    QCheckBox * checkBox2 = new QCheckBox("Quit", &window);
    checkBox2->move(10,40);
    QObject::connect(checkBox2, SIGNAL(stateChanged(int)),
                                 qApp, SLOT(quit()));

Am conectat chckBox2 -ul cand lanseaza SIGNAL(stateChanged(int)) prin conducta, cu obiectul qApp pe slotul SLOT(quit()).
Emiterea semnalului duce la apelarea metodei, functiei, slot.

Intrebare de control:
Ce noutate apare aici ?

Raspuns:
Avem o conexiune semnal slot  in care semnalul are parametru dar slotul nu foloseste parametrul. La Qt 5.9 merge perfect.

Dati click si schimbati starea checkbox-ului al II-lea si aplicatia se inchide!

Scuze, fireste ca nu pot pune poza cu checkbox-ul bifat pe blog, cand dau click sa il bifez, aplicatia se inchide!

Doriti efecte mai complicate: Dirijati semnalul catre un slot cu o metoda mai complexa, a altui obiect, sau chiar a obiectului derivat din clasa aplicatiei. 

In imagine: App-ul in curs de editare. Se vede noua conexiune.


RADIO BUTOANELE

Dati pagina la pagina 154.
Intai vor trebui create cele doua grupuri de radio butoane:

QButtonGroup b1((QObject *)&window);
// Adresa parintelui se va converti la (QObject*)

QButtonGroup b2((QObject *)&window);
// Al doilea grup, imple-mentat ca QButtonGroup.

Problema aici: Desi am o clasa QButtonGroup, usor de gasit, in Help sau Index, ea are un constructor de forma:
QButtonGroup(QObject *)

Adica parametrul transmis la construire trebuie sa fie un QObject, iar noi am convertit fortat adresa lui obiectului window, notata &window, la QObject.
Paranteza cu un tip in ea, cum e (QObject) se numeste cast in C.

Nota: La o versiune anterioara de Qt, (sa testeze cei care folosesc Qt 4.6), era , daca imi amintesc bine, necesara aceasta conversie.
La Qt 5.9 sub Linux, deja nu mai este necesara.

Creati radio butoanele si puneti-le in grupuri.
Noi am folosit o bucla for, ca fiind cea mai rapida metoda, dar are dezavantajul
ca produce butoane, oarecum , in serie:

QRadioButton * v[3]; // Am creat un vector de pointeri la RadioButoane

// Se putea folosi și un sablon QVector

for (int i=0; i <3 ; i++)
{
v[i]=new QRadioButton(”Click”, &window);
b1.addButton(v[i]);
v[i]->move(i*60+10,80);
v[i]->show();
};

Corpul functie main, atunci cand am pus doar un vector de radio butoane.

Asa ruleaza aplicatia deocamdata!

 Cititi explicatiiile de la pagina 154. [pg 154]. Treceti la pagina 155.
Adaugam acum al doilea grup de radio butoane.

...
QRadioButton * w[3];
// Se putea folosi și un sablon QVector
for (int i=0; i <3 ; i++)
{
    w[i]=new QRadioButton(”Click”, &window);
    b2.addButton(w[i]);
    w[i]->move(i*60+10,120);
    w[i]->show();
};

Rulati aplicatia:

Incercati sa bifati ca in imagine, apoi sa bifati al treilea element din randul intai de butoane.

Intrebare de control:
Ce trebuie sa se intample ?

Exercitiu:
Faceti ca aplicatia, atunci cand bifati primul checkbox sa arate versiunea  Qt-ului apeland metoda-slot aboutQt() a obiectului aplicatie !

Solutie:

 QObject::connect(& checkBox, SIGNAL(clicked()), qApp,SLOT(aboutQt()));

Iar cand bifati, ca in imaginea de mai sus [] Am priceput, trebuie sa obtineti fereastra aboutQt() a Qt-ului, la versiunea 5.9 arata asa:


Exercitiu:
Renuntati la buclele for si creati 6 radio butoane cu nume diferite !

Pauza:

Dupa pauza ne vedem pe o pagina noua: Qt - Group Box-uri cu  layout.
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
Nota: In Qt 5.9 de Linux, instalat asa cum v-am prezentat la prima lectie,
exista o serie de exemple care includ astfel de controale, le-ati gasit ?
unele ilustreaza ceva mai mult. Va rog sa le rulati si sa vedeti cum au fost create radio butoanele.

Window flag example, Troll print, Tree model, I18NExample, Styles Example.
Group Box Example (!),

                        In imagine: Group Box Example (!), foloseste alt mod de grupare, foloseste pentru grupare niste QGroupBox-uri puse intr-un layout.

Niciun comentariu:

Trimiteți un comentariu