Sunteți pe pagina 1din 6

Lucrarea 1

Introducere în programare cu Qt

Qt este o suită de dezvoltare pentru aplicaţii vizuale, ce permite realizarea rapidă şi


uşoare a acestor aplicaţii indiferent de platforma folosită. Dezvoltat în limbajul C++,
complet orientat pe obiecte, Qt pune la dispoziţie o multitudine de clase, ce oferă
o interfaţă de programare (API) comună pentru platformele Win32, X11, MacOSX,
PocketPC, Embedded Linux şi Symbian. Aceasta permite portarea uşoară a aplicaţiilor
vizuale pentru diferite platforme.

1.1. Managementul de evenimente


Aplicaţiile vizuale sunt caracterizate prin faptul că permit afişarea diferitelor compo-
nente pe ecran, care pot interacţiona cu utilizatorul. Această interacţiune este realizată
prin intermediul unor mesaje transmise de către sistemul de operare sau alte compo-
nente din sistem. De exemplu apăsarea butonului de mouse asupra componentei va
rezulta în transmiterea unui mesaj corespunzător la componentă, care la urma acesteia
va executa rutina asociată apăsării butonului.
Pentru tratarea acestor mesaje fiecare aplicaţie trebuie să implementeze o buclă de
mesaje, o buclă infinită în care sunt recepţionate mesajele şi care conţine identificarea
fiecărui mesaj şi apelarea funcţiilor asociate cu acestea.
Implementările acestor bucle de mesaje depind de platforma folosită. Pentru a oferi
o interfaţă independentă de platformă, Qt oferă un sistem special pentru tratarea me-
sajelor, care este tradusă intern în forma dependentă de platformă. Acest sistem se
numeşte mecanismul signal-slot, şi este bazat pe nişte metainformaţii asociate obiec-
telor, prin care membrii acestora pot fi definiţi ca semnale (signal) şi sloturi. Fiecare
obiect din Qt poate conţine membrii de tip signal, care pot fi emise în orice moment
şi care va fi tratat de managerul de eveniment intern.
De asemenea obiectele pot avea funcţii speciale marcate ca sloturi, care au rolul
de a trata semnalele trimise către obiect. Corespondenţa dintre semnale şi sloturi este
stocat într-o tabelă internă în care pot fi adăugate conexiuni în mod dinamic de către
obiectele aferente. Între semnale şi sloturi pot exista conexiuni de tip multe-la-multe,

1
1. Introducere în programare cu Qt

ceea ce înseamnă că la un semnal poate fi conectat mai multe sloturi, respectiv mai
multe semnale pot fi conectate la un slot.
La emisia unui semnal managerul de evenimente din Qt verifică dacă semnalul are
asociat unul sau mai multe sloturi, şi dacă găseşte astfel de sloturi le va apela fiecare pe
rând. În corpul semnalelor pot fi transmise şi diferite parametrii, astfel se poate realiza
o comunicare asincronă între difeite obiecte din sistem.

1.2. Structura programelor Qt


Programele Qt sunt bazate pe nişte clase de bază, ce vor fi folosite (fie direct fie prin
subclase) în toate aplicaţiile.

Clasa QObject
Clasa QObject este clasa de bază a tuturor claselor din Qt, care sunt incluse în sistemul
signal-slot. Această clasă conţine metainformaţiile necesare pentru identificarea obiec-
telor în timpul rulării. Fără aceste informaţii, managerul de evenimente nu ar putea
găsi obiectul căreia trebuie trimis semnalul.
Toate clasele ce folosesc semnale şi/sau sloturi trebuie moştenite din clasa QObject.
Pentru ca şi clasele moştenite să conţină metainformaţiile necesare, fiecare clasă trebuie
să conţină macro-ul Q_OBJECT declarat la începutul clasei pe o linie separată.
Cea mai importantă funcţie pusă la dispoziţie de QObject este connect, ce permite
conectarea unui semnal emis de un obiect sursă la un slot dintr-un obiect destinaţie:
connect ( const QObject * sender , const char * signal ,
const QObject * receiver , const char * method )
Pointerii sender şi receiver arată către obiecte sursă şi destinaţie iar signal
şi method conţine denumirile semnalului respectiv a slotului. Pentru a genera aceste
denumiri, se pot folosi macro-urile SIGNAL(signalName) respectiv SLOT(slotName).

Clasa QApplication
Clasa QApplication conţine managerul de evenimente, fiecare aplicaţie Qt trebuie să
conţină un obiect şi numai unul de tip QApplication. Aceasta conţine toate informaţiile
despre program şi poate fi accesat de către toate obiectele din program prin intermediul
variabilei globale qApp.
Principala funcţie a clasei este funcţia exec() care porneşte managerul de eveni-
mente. Această funcţie conţine o buclă infinită pentru tratarea mesajelor şi transmi-
terea semnalelor către sloturi, de aceea funcţia trebuie apelată ca şi ultima în funcţia
main(), după toate iniţializările programului.

2
Structura programelor Qt

Clasa QWidget
Clasa QWidget stă la baza tuturor componentelor ce vor fi afişate pe ecran. Pentru a
realiza acest lucru clasa oferă toate informaţiile necesare pentru ocuparea unei regiuni
pe ecran, tratarea mesajelor venite de la utilizator (tastatură şi mouse) şi funcţii ce
permit desenarea pe regiunea rezervată.
Toate componentele din Qt ce se afişează pe ecran moştenesc clasa QWidget. Pentru
a crea componente personalizate, acestea trebuie să implementeze metodele de tratarea
a diferitelor evenimente ce se pot întâlni în sistem: paintEvent, mouseEvent, keyEvent,
etc...

Exemplu de program Qt
Următorul exemplu demonstrează implementarea unei aplicaţii simple Qt:
# include < QApplication >
# include <QLabel >

int main (int argc , char * argv [])


{
QApplication a(argc , argv );
QLabel label ;
label . setText (" <p style ='font - size : 52 pt; color : #336633;
background - color : # CCFFCC '> Hello world </p>");
label . show ();

return a. exec ();


}
Programul începe cu instanţierea obiectului de bază QApplication, care va porni
managerul de evenimente prin metoda exec(). Această metodă conţine bucla care
preia toate semnalele emise de obiectele din program şi transmite către sloturile cores-
punzătoare.
Bucla continuă până când obiectul QApplication în sine primeşte un semnal
quit() din interior sau exterior, sau este apelat funcţia exit(). În mod implicit apli-
caţia se va închide şi în cazul în care este emis semnalul lastWindowClosed(), ceea ce
înseamnă că toate ferestrele vizibile a programului au fost închise.
Înainte de pornirea managerului de evenimente trebuie creată şi cel puţin o fereastră
vizibilă (altfel aplicaţia s-ar închide imediat). În exemplul dat este creat un obiect de
tip QLabel care permite afişarea unui text sau a unei imagini pe fereastra asociată.
Textul poate să fie un text simplu sau chiar un text formatat de tip RTF sau HTML. Qt
interpretează complet formatul HTML inclusiv şi stilurile CSS, aşa cum se poate vedea
în exemplul dat. Funcţia show() permite afişarea ferestrei pe ecran astfel asigurând
existenţa unei ferestre vizibile.

3
1. Introducere în programare cu Qt

Compilarea programelor Qt
Programele Qt sunt alcătuite pe lângă codurile sursă (.h şi .cpp) din interfeţe utili-
zator (.ui) şi resurse (.qrc). Pentru compilarea acestora din urmă mediul Qt pune
la dispoziţie tool-urile uic şi rcc care vor genera codul sursă aferent interfeţelor şi
resurselor ce trebuie compilate împreună cu restul codului sursă.
Pentru a realiza mecanismul signal-slot, Qt foloseşte multe metainformaţii asociate
claselor Qt, care trebuie la fel convertite în cod sursă pentru a putea fi compilate. Pentru
a realiza acest lucru Qt oferă tool-ul moc (Meta Object Compiler) care va genera codul
sursă din metainformaţiile din sursele programului
Pentru a uşura realizarea acestor paşi necesari compilării, Qt foloseşte sistemul
qmake, care pe baza unor informaţii simple despre fişierele asociate proiectului va genera
un Makefile care are grijă de realizarea tuturor paşilor de compilare. Pentru a folosi
qmake este nevoie de un fişier proiect (.pro) care conţine componentele programului.
Astfel pentru a compila exemplul prezentat anterior este nevoie de un fişier
hello.pro:
TARGET = hello
TEMPLATE = app
SOURCES += main . cpp
Conţinutul fişierului specifică numele executabilului ce va fi generat (TARGET), tipul
executabilului (TEMPLATE) ce poate fi aplicaţie (app) sau bibliotecă (lib) şi fişierele
sursă ce alcătuiesc programul (SOURCES). Alte opţiuni importante includ fişierele header
(HEADERS), resursele (RESOURCES) şi interfeţele utilizator (FORMS).
Pentru a compila programul trebuie lansate comenzile:
> qmake
> make
După compilare aplicaţia poate fi rulată cu comanda
> ./ hello
ceea ce în cazul exemplului prezentat anterior va rezulta în fereastra prezentată pe
figura 1.1.

Figura 1.1. Aplicaţia hello

4
Crearea interfeţelor utilizator

1.3. Crearea interfeţelor utilizator


Interfeţele utilizator pot fi create foarte uşor prin intermediul programului QtDesig-
ner. Aceasta este un mediu interactiv care permite construirea interfeţelor din diferite
componente standard, aranjarea acestora, configurarea componentelor şi a comporta-
mentelor acestora.
QtDesigner (fig. 1.2) este un program alcătuit din mai multe panouri:

• Widget Box - conţine componentele principale din Qt, ce pot fi puse pe interfaţa
creată prin drag&drop

• Object Inspector - afişează o structură arborescentă a tuturor componentelor


folosite

• Property Editor - conţine lista tuturor proprietăţilor compoentei selectate, ce pot


fi modificate în timpul proiectării

• un panou ce conţine editorul de conexiuni (între semnale şi sloturi), editorul


de acţiuni (folosite pentru meniuri şi toolbar-uri) şi editorul de resurse (folosite
pentru adăugarea resurselor de tip imagini sau text)

Principala componentă din QtDesigner este interfaţa creată în sine, pe care se pot
depune componentele şi oferă o vizualizare a acestei chiar în forma cum va apărea pe
ecran programul final.

Figura 1.2. QtDesigner în lucru

5
1. Introducere în programare cu Qt

Interfeţele generate sunt stocate în fişiere de tip XML cu extensia .ui, şi care pot
fi convertite în cod C++ cu ajutorul utilitarului uic. Pentru ca interfaţa să fie inclusă
în proiectul qmake aceasta trebuie adăugată la secţiunea FORMS.

S-ar putea să vă placă și