Qt wiki will be updated on October 12th 2023 starting at 11:30 AM (EEST) and the maintenance will last around 2-3 hours. During the maintenance the site will be unavailable.

Getting Started Programming with Qt/ro: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
No edit summary
Line 1: Line 1:
=Notiuni de baza pentru programare cu Qt=
[[Category:Learning]]


Bun venit in lumea Qt—toolkitul <span class="caps">GUI</span> multi-platforma. In acest articol de introducere vom prezenta notiuni de baza pentru programarea cu Qt prin implementarea unei simple aplicatii Notepad. Dupa citirea acestui ghid veti fi pregatiti sa rasfoiti documentatia noastra si sa gasiti informatiile necesare pentru aplicatia pe care o dezvoltati.
= Notiuni de baza pentru programare cu Qt =


==Hello Notepad==
Bun venit in lumea Qt—toolkitul GUI multi-platforma. In acest articol de introducere vom prezenta notiuni de baza pentru programarea cu Qt prin implementarea unei simple aplicatii Notepad. Dupa citirea acestui ghid veti fi pregatiti sa rasfoiti documentatia noastra si sa gasiti informatiile necesare pentru aplicatia pe care o dezvoltati.
 
== Hello Notepad ==


In acest prim exemplu vom crea un simplu editor de text intr-o fereastra. Acesta reprezinta cel mai simplu program Qt cu interfata grafica.
In acest prim exemplu vom crea un simplu editor de text intr-o fereastra. Acesta reprezinta cel mai simplu program Qt cu interfata grafica.


[[Image:gs1.png|Notepad]]
[[Image:http://doc.qt.nokia.com/4.7/images/gs1.png|Notepad]]


Codul necesar pentru a crea aplicatia:
Codul necesar pentru a crea aplicatia:


Sa urmarim codul line cu line. In primele doua linii includem fisierele hedear [http://doc.trolltech.com/latest/qapplication.html QApplication] ''[doc.trolltech.com]'' si [http://doc.trolltech.com/latest/qtextedit.html QTextEdit] ''[doc.trolltech.com]'', acestea fiind clasele de care avem nevoie pentru aceasta aplicatie. Toate clasele din Qt au un header denumit dupa ele.
<code>#include &lt;QApplication&amp;gt;<br />#include &lt;QTextEdit&amp;gt;


Linia 6 creaza o instanta a obiectului [http://doc.trolltech.com/latest/qapplication.html QApplication] ''[doc.trolltech.com]''. Acest obiect gestioneaza resursele aplicatiei si este neccesar pentru a rula orice aplicatie Qt care are o interfata grafica. Acesta ia ca parametri argv si args pentru ca Qt accepta cativa parametrii de start.
int main(int argv, char *'''args)<br />{<br /> QApplication app(argv, args);
<br /> QTextEdit textEdit;<br /> textEdit.show();
<br /> return app.exec&amp;amp;#40;&amp;#41;;<br />}</code>
<br />Sa urmarim codul line cu line. In primele doua linii includem fisierele hedear &quot;QApplication&amp;quot;:http://doc.trolltech.com/latest/qapplication.html si &quot;QTextEdit&amp;quot;:http://doc.trolltech.com/latest/qtextedit.html, acestea fiind clasele de care avem nevoie pentru aceasta aplicatie. Toate clasele din Qt au un header denumit dupa ele.
<br />Linia 6 creaza o instanta a obiectului &quot;QApplication&amp;quot;:http://doc.trolltech.com/latest/qapplication.html. Acest obiect gestioneaza resursele aplicatiei si este neccesar pentru a rula orice aplicatie Qt care are o interfata grafica. Acesta ia ca parametri argv si args pentru ca Qt accepta cativa parametrii de start.
<br />Linia 8 creaza un obiect de tip &quot;QTextEdit&amp;quot;:http://doc.trolltech.com/latest/qtextedit.html. Un editor de text este un element vizual in interfata grafica (GUI). In Qt aceste elemente se numesc widget-uri. Exemple de widget-uri sunt etichete, butoane radio, bare de derulare. Un widget poate fi deasemena si un container pentru alte widget-uri; o casuta de dialog sau o fereastra principala a aplicatiei de exemplu.
<br />Linia 9 arata editorul de text in propria lui fereastra. Deoarece widget-urile pot fi si container (de exemplu &quot;QMainWindow&amp;quot;:http://doc.qt.nokia.com/latest/qmainwindow.html care contine bare de instrumente, meniuri, bara de stare si alte widgeturi), este posibila afisarea unui singur widget in propria sa fereastra. Widget-urile nu sunt vizibile implicit functia &quot;show()&quot;:http://doc.qt.nokia.com/latest/qwidget.html#show face widget-ul vizibil.
<br />Linia 11 face ca obiectul &quot;QApplication&amp;quot;:http://doc.trolltech.com/latest/qapplication.html sa intre in bucla de evenimente. Cand o aplicatie Qt ruleaza, evenimente sunt generate si trimise widget-urilor care apartin de aplicatie. Exemple de astfel de evenimente sunt apasari ale butoanelor de la mouse sau apsari a butoanelor de la tastatura. Im momentul in care tastati text in editorul de text, acesta primeste evenimentele generate in urma apasari tastelor si raspunde la aceste evenimente desenand text pe ecran.
<br />Pentru a rula aplicatia, deschideti o consola, intrati in directorul unde ati salvat fisierul .cpp. Urmatoarele comenzi vor construi aplicatia.
<br /><code>qmake -projetc<br />qmake<br />make</code>
<br />Aceste comenzi vor genera un executabil in directorul part1 (atentie pe windows e posibil sa fie nevoie sa rulati comanda nmake in loc de make. De asemenea executabilul va fi plasat ub folderul part1/debug sau part1/release). qmake este un utilitar care ia ca si parametru un fisier de configurare. qmake genereaza pentru noi acest fisier de configurare cand este rulat cu parametru <s>project. Odata generat fisierul de configurare (cu extensia .pro) qmake produce un fisier make care va construi programul pentru noi. Vom studia cum putem scrie propriile noastre fisiere .pro mai tarziu.
<br />h3. Studiati in continuare
<br />* Widget-rui si geometria acestora</s> &quot;Widget-uri ferestre si dialoguri&amp;quot;:http://doc.qt.nokia.com/latest/application-windows.html<br />''' Evenimente si modul de tratare a acestora - &quot;Sistemul de evenimente&amp;quot;:http://doc.qt.nokia.com/latest/eventsandfilters.html


Linia 8 creaza un obiect de tip [http://doc.trolltech.com/latest/qtextedit.html QTextEdit] ''[doc.trolltech.com]''. Un editor de text este un element vizual in interfata grafica (<span class="caps">GUI</span>). In Qt aceste elemente se numesc widget-uri. Exemple de widget-uri sunt etichete, butoane radio, bare de derulare. Un widget poate fi deasemena si un container pentru alte widget-uri; o casuta de dialog sau o fereastra principala a aplicatiei de exemplu.
== Adaugarea unu button de iesire ==


Linia 9 arata editorul de text in propria lui fereastra. Deoarece widget-urile pot fi si container (de exemplu [http://doc.qt.nokia.com/latest/qmainwindow.html QMainWindow] ''[doc.qt.nokia.com]'' care contine bare de instrumente, meniuri, bara de stare si alte widgeturi), este posibila afisarea unui singur widget in propria sa fereastra. Widget-urile nu sunt vizibile implicit functia [http://doc.qt.nokia.com/latest/qwidget.html#show show()] ''[doc.qt.nokia.com]'' face widget-ul vizibil.
Intr-o aplicatie reala, avem nevoie de mai multe widget-uri. Vom introduce un &quot;QPushButton&amp;quot;:http://doc.qt.nokia.com/latest/qpushbutton.html sub editorul de text. Butonul va opri aplicatia in momentul in care este apasat (facand click cu mouse pe el,de exemplu).


Linia 11 face ca obiectul [http://doc.trolltech.com/latest/qapplication.html QApplication] ''[doc.trolltech.com]'' sa intre in bucla de evenimente. Cand o aplicatie Qt ruleaza, evenimente sunt generate si trimise widget-urilor care apartin de aplicatie. Exemple de astfel de evenimente sunt apasari ale butoanelor de la mouse sau apsari a butoanelor de la tastatura. Im momentul in care tastati text in editorul de text, acesta primeste evenimentele generate in urma apasari tastelor si raspunde la aceste evenimente desenand text pe ecran.
[[Image:http://doc.qt.nokia.com/4.7/images/gs2.png|Notepad]]


Pentru a rula aplicatia, deschideti o consola, intrati in directorul unde ati salvat fisierul .cpp. Urmatoarele comenzi vor construi aplicatia.
Sa aruncam o privire asupra codului:


Aceste comenzi vor genera un executabil in directorul part1 (atentie pe windows e posibil sa fie nevoie sa rulati comanda nmake in loc de make. De asemenea executabilul va fi plasat ub folderul part1/debug sau part1/release). qmake este un utilitar care ia ca si parametru un fisier de configurare. qmake genereaza pentru noi acest fisier de configurare cand este rulat cu parametru -project. Odata generat fisierul de configurare (cu extensia .pro) qmake produce un fisier make care va construi programul pentru noi. Vom studia cum putem scrie propriile noastre fisiere .pro mai tarziu.
<code>#include &lt;QtGui&amp;gt;


===Studiati in continuare===
int main(int argv, char **args)<br />{<br /> QApplication app(argv, args);


* Widget-rui si geometria acestora – [http://doc.qt.nokia.com/latest/application-windows.html Widget-uri ferestre si dialoguri] ''[doc.qt.nokia.com]''
QTextEdit textEdit;<br /> QPushButton quitButton(&quot;Quit&amp;quot;);
* Evenimente si modul de tratare a acestora – [http://doc.qt.nokia.com/latest/eventsandfilters.html Sistemul de evenimente] ''[doc.qt.nokia.com]''


==Adaugarea unu button de iesire==
QObject::connect(&amp;quitButton, SIGNAL (clicked()), qApp, SLOT (quit()));


Intr-o aplicatie reala, avem nevoie de mai multe widget-uri. Vom introduce un [http://doc.qt.nokia.com/latest/qpushbutton.html QPushButton] ''[doc.qt.nokia.com]'' sub editorul de text. Butonul va opri aplicatia in momentul in care este apasat (facand click cu mouse pe el,de exemplu).
QVBoxLayout layout;<br /> layout.addWidget(&amp;textEdit);<br /> layout.addWidget(&amp;quitButton);


[[Image:gs2.png|Notepad]]
QWidget window;<br /> window.setLayout(&amp;layout);


Sa aruncam o privire asupra codului:
window.show();
 
return app.exec&amp;amp;#40;&amp;#41;;<br />}</code>


Linia 1 include [http://doc.qt.nokia.com/latest/qtgui.html QtGui] ''[doc.qt.nokia.com]'', care contine toate clasele <span class="caps">GUI</span> din Qt.
Linia 1 include &quot;QtGui&amp;quot;:http://doc.qt.nokia.com/latest/qtgui.html, care contine toate clasele GUI din Qt.


Linia 10 foloseste mecanismul signal slot din Qt pentru a face aplicatia sa se inchida in momentul in care '''Butonul Quit''' este apasat. Un slot este o functie care poate fi invocata in timpul executiei folosind numele ei (ca un sir de caractere literal). Un semnal este o functie care in momentul invocarii apeleaza toate slot-urile inregistrate cu acesta; apelam acestea pentru a conecta slotul la semnal si a emite semnalul.
Linia 10 foloseste mecanismul signal slot din Qt pentru a face aplicatia sa se inchida in momentul in care '''Butonul Quit''' este apasat. Un slot este o functie care poate fi invocata in timpul executiei folosind numele ei (ca un sir de caractere literal). Un semnal este o functie care in momentul invocarii apeleaza toate slot-urile inregistrate cu acesta; apelam acestea pentru a conecta slotul la semnal si a emite semnalul.


[http://doc.qt.nokia.com/latest/qcoreapplication.html#quit quit()] ''[doc.qt.nokia.com]'' este un slot a [http://doc.trolltech.com/latest/qapplication.html QApplication] ''[doc.trolltech.com]'' care intrerupe executia aplicatiei. [http://doc.qt.nokia.com/latest/qabstractbutton.html#clicked clicked()] ''[doc.qt.nokia.com]'' este un semnal emis de QPushButton”:http://doc.qt.nokia.com/latest/qpushbutton.html in momentul in care acesta este apasat. Functia statica [http://doc.qt.nokia.com/latest/qobject.html#connect QObject::connect()] ''[doc.qt.nokia.com]'' va conecta slotul la semnal. <span class="caps">SIGNAL</span> si <span class="caps">SLOT</span> sunt doua macro-uri care iau ca parametrii semnaturile functilor care reprezinta semnalul si slotul care vor fi conectate. De asemenea trebuie sa furnizam si pointeri catre obiectele care vor emite si receptiona semnalul.
&quot;quit()&quot;:http://doc.qt.nokia.com/latest/qcoreapplication.html#quit este un slot a &quot;QApplication&amp;quot;:http://doc.trolltech.com/latest/qapplication.html care intrerupe executia aplicatiei. &quot;clicked()&quot;:http://doc.qt.nokia.com/latest/qabstractbutton.html#clicked este un semnal emis de QPushButton&amp;quot;:http://doc.qt.nokia.com/latest/qpushbutton.html in momentul in care acesta este apasat. Functia statica &quot;QObject::connect()&quot;:http://doc.qt.nokia.com/latest/qobject.html#connect va conecta slotul la semnal. SIGNAL () si SLOT() sunt doua macro-uri care iau ca parametrii semnaturile functilor care reprezinta semnalul si slotul care vor fi conectate. De asemenea trebuie sa furnizam si pointeri catre obiectele care vor emite si receptiona semnalul.


Linia 12 creaza un [http://doc.qt.nokia.com/latest/qvboxlayout.html QVBoxLayout] ''[doc.qt.nokia.com]''. Precum am mentionat adineauri, widget-urile pot contine alte widget-uri. Este posibila setarea locatiei si a dimensiunilor a widget-urilor continute direct, dar de obicei este mai usor folosirea unui layout. Un layout gestioneaza locatia si dimensiunea widget-urilor. [http://doc.qt.nokia.com/latest/qvboxlayout.html QVBoxLayout] ''[doc.qt.nokia.com]'' , de exemplu, aseaza widget-urile intr-un rand pe verticala.
Linia 12 creaza un &quot;QVBoxLayout&amp;quot;:http://doc.qt.nokia.com/latest/qvboxlayout.html. Precum am mentionat adineauri, widget-urile pot contine alte widget-uri. Este posibila setarea locatiei si a dimensiunilor a widget-urilor continute direct, dar de obicei este mai usor folosirea unui layout. Un layout gestioneaza locatia si dimensiunea widget-urilor. &quot;QVBoxLayout&amp;quot;:http://doc.qt.nokia.com/latest/qvboxlayout.html , de exemplu, aseaza widget-urile intr-un rand pe verticala.


Linia 13 si 14 adauga editorul de text si butonul in layout iar linia 17 seteaza layoutul pe widget.
Linia 13 si 14 adauga editorul de text si butonul in layout iar linia 17 seteaza layoutul pe widget.


===Studiati in continuare===
=== Studiati in continuare ===


* Semnale si slot-uri – [http://doc.qt.nokia.com/latest/signalsandslots.html Semnale &amp; Slot-uri] ''[doc.qt.nokia.com]''
* Semnale si slot-uri - &quot;Semnale &amp; Slot-uri&amp;quot;:http://doc.qt.nokia.com/latest/signalsandslots.html
* Layout-uri – [http://doc.qt.nokia.com/latest/layout.html Administrarea Layout-ului] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/latest/widgets-and-layouts.html Widget-uri si Layout-uri] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/latest/examples-layouts.html Exemple de Layout] ''[doc.qt.nokia.com]''
* Layout-uri - &quot;Administrarea Layout-ului&amp;quot;:http://doc.qt.nokia.com/latest/layout.html, &quot;Widget-uri si Layout-uri&amp;quot;:http://doc.qt.nokia.com/latest/widgets-and-layouts.html, &quot;Exemple de Layout&amp;quot;:http://doc.qt.nokia.com/latest/examples-layouts.html
* Widget-uri care vin cu Qt – [http://doc.qt.nokia.com/latest/gallery.html Galeria de Widget-uri Qt] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/latest/examples-widgets.html Exemple de Widget-uri] ''[doc.qt.nokia.com]''
* Widget-uri care vin cu Qt - &quot;Galeria de Widget-uri Qt&amp;quot;:http://doc.qt.nokia.com/latest/gallery.html, &quot;Exemple de Widget-uri&amp;quot;:http://doc.qt.nokia.com/latest/examples-widgets.html


==Derivarea din QWidget==
== Derivarea din QWidget ==


In momentul in care utilizatorul vrea sa inchida aplicatia, e posibil sa doriti sa afisati un mesaj intreband utilizatorul daca el/ea chiar doreste sa inchida aplicatia. In acest exemplu, vom deriva din [http://doc.qt.nokia.com/latest/qwidget.html QWidget] ''[doc.qt.nokia.com]'' si vom adauga un slot pe care il vom conecta la '''buton de Quit.'''
In momentul in care utilizatorul vrea sa inchida aplicatia, e posibil sa doriti sa afisati un mesaj intreband utilizatorul daca el/ea chiar doreste sa inchida aplicatia. In acest exemplu, vom deriva din &quot;QWidget&amp;quot;:http://doc.qt.nokia.com/latest/qwidget.html si vom adauga un slot pe care il vom conecta la '''buton de Quit.'''


[[Image:gs3.png]]
[[Image:http://doc.qt.nokia.com/4.7/images/gs3.png|http://doc.qt.nokia.com/4.7/images/gs3.png]]


Sa aruncam o privire asupra codului:
Sa aruncam o privire asupra codului:


Macroul Q_OBJECT trebuie definit primul in clasa, acesta declara clasa noastra ca fiind un QObject (Normal trebuie sa si mostenim din [http://doc.qt.nokia.com/latest/qobject.html QObject] ''[doc.qt.nokia.com]''). Un [http://doc.qt.nokia.com/latest/qobject.html QObject] ''[doc.qt.nokia.com]'' adauga cateva abilitati unei clase normale de C++. Notbail este ca numele clasei si numele sloturi-lor pot fi interogate in timpul executiei. Este posibil deasemenea interogarea tipului parametrilor unui slot si invocarea acestuia.
<code>class Notepad : public QWidget<br />{<br /> Q_OBJECT
 
Linia 13 declara slotul quit(). Acest lucru este usor flosind macroul slots. Slot-ul quit() poate fi acum conectat la semnale care au acelasi numar si tip de parametri (orice semnal ce nu ia parametri in cazul nostru). <br /> In loc de a seta interfata grafica si a conecta slot-ul in main, vom folosi constructorul clasei Notepad.
 
Dupa cum se poate vedea in definitia clasei, folosim pointeri catre obiectele noastre de tip [http://doc.qt.nokia.com/latest/qobject.html QObject] ''[doc.qt.nokia.com]'' (textEdit si quitButton). Ca o regula, este indicata alocarea obiectelor [http://doc.qt.nokia.com/latest/qobject.html QObject] ''[doc.qt.nokia.com]'' pe heap si necopierea acestora.


Putem folosi acum functia [http://doc.qt.nokia.com/latest/qobject.html#tr tr()] ''[doc.qt.nokia.com]'' pentru a incapsula sirurile de caractere vizibile. Acest lucru este necesar daca dorim distribuirea aplicatiei in mai mult de o limba (Engleza si Chineza de exemplu). Nu vom intra in detalii aici, dar puteti sa urmati linkurile de mai jos pentru a afla mai multe.
public:<br /> Notepad();


===Studiati in continuare===
private slots:<br /> void quit();


* tr() si internationalizarea – [http://doc.qt.nokia.com/latest/linguist-manual.html Manual Qt Linguist] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/latest/i18n-source-translation.html Scrierea de cod pentru traduceri] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/latest/linguist-hellotr.html Exemplul Hello tr()] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/latest/internationalization.html Internationalizarea cu Qt] ''[doc.qt.nokia.com]''
private:<br /> QTextEdit *textEdit;<br /> QPushButton *quitButton;<br />};</code>
* [http://doc.qt.nokia.com/latest/qobject.html QObjects] ''[doc.qt.nokia.com]'' si modelul Qt pentru obiecte (Acest lucru este necesar pentru a intelege Qt) – [http://doc.qt.nokia.com/latest/object.html Modelul de Obiecte] ''[doc.qt.nokia.com]''
* qmake si sistem de constructie Qt – [http://doc.qt.nokia.com/latest/qmake-manual.html Manual qmake] ''[doc.qt.nokia.com]''


==Crearea unui fisier .pro==
Macroul Q_OBJECT trebuie definit primul in clasa, acesta declara clasa noastra ca fiind un QObject (Normal trebuie sa si mostenim din &quot;QObject&amp;quot;:http://doc.qt.nokia.com/latest/qobject.html). Un &quot;QObject&amp;quot;:http://doc.qt.nokia.com/latest/qobject.html adauga cateva abilitati unei clase normale de C++. Notbail este ca numele clasei si numele sloturi-lor pot fi interogate in timpul executiei. Este posibil deasemenea interogarea tipului parametrilor unui slot si invocarea acestuia.


Pentru acest exemplu vom scrie propriul nostru fisier .pro in loc de a folosi parametul -project al qmake.
Linia 13 declara slotul quit(). Acest lucru este usor flosind macroul slots. Slot-ul quit() poate fi acum conectat la semnale care au acelasi numar si tip de parametri (orice semnal ce nu ia parametri in cazul nostru).<br />In loc de a seta interfata grafica si a conecta slot-ul in main, vom folosi constructorul clasei Notepad.


Urmatoarele comenzi pentru consola construiesc aplicatia.
<code>Notepad::Notepad()<br />{<br /> textEdit = new QTextEdit;<br /> quitButton = new QPushButton(tr(&quot;Quit&amp;quot;));


==Folosirea unei QMainWindow==
connect(quitButton, SIGNAL (clicked()), this, SLOT (quit()));


Multe aplicati ar beneficia din folosirea unei [http://doc.qt.nokia.com/latest/qmainwindow.html QMainWindow] ''[doc.qt.nokia.com]'', care are propriul layout pe care putem adauga: bari de meniu, bari de instrumente si bara de status. [http://doc.qt.nokia.com/latest/qmainwindow.html QMainWindow] ''[doc.qt.nokia.com]'' are o zona centrala in care poate fi adaugat orice widget. In cazul nostru, vom adauga editorul de text aici.
QVBoxLayout '''layout = new QVBoxLayout;<br /> layout-&gt;addWidget(textEdit);<br /> layout-&gt;addWidget(quitButton);
<br /> setLayout(layout);
<br /> setWindowTitle(tr(&quot;Notepad&amp;quot;));<br />}</code>
<br />Dupa cum se poate vedea in definitia clasei, folosim pointeri catre obiectele noastre de tip &quot;QObject&amp;quot;:http://doc.qt.nokia.com/latest/qobject.html (textEdit si quitButton). Ca o regula, este indicata alocarea obiectelor &quot;QObject&amp;quot;:http://doc.qt.nokia.com/latest/qobject.html pe heap si necopierea acestora.
<br />Putem folosi acum functia &quot;tr()&quot;:http://doc.qt.nokia.com/latest/qobject.html#tr pentru a incapsula sirurile de caractere vizibile. Acest lucru este necesar daca dorim distribuirea aplicatiei in mai mult de o limba (Engleza si Chineza de exemplu). Nu vom intra in detalii aici, dar puteti sa urmati linkurile de mai jos pentru a afla mai multe.
<br />h3. Studiati in continuare
<br />''' tr() si internationalizarea - &quot;Manual Qt Linguist&amp;quot;:http://doc.qt.nokia.com/latest/linguist-manual.html, &quot;Scrierea de cod pentru traduceri&amp;quot;:http://doc.qt.nokia.com/latest/i18n-source-translation.html, &quot;Exemplul Hello tr()&quot;:http://doc.qt.nokia.com/latest/linguist-hellotr.html, &quot;Internationalizarea cu Qt&amp;quot;:http://doc.qt.nokia.com/latest/internationalization.html<br />* &quot;QObjects&amp;quot;:http://doc.qt.nokia.com/latest/qobject.html si modelul Qt pentru obiecte (Acest lucru este necesar pentru a intelege Qt) - &quot;Modelul de Obiecte&amp;quot;:http://doc.qt.nokia.com/latest/object.html<br />* qmake si sistem de constructie Qt - &quot;Manual qmake&amp;quot;:http://doc.qt.nokia.com/latest/qmake-manual.html


[[Image:gs4.png]]
== Crearea unui fisier .pro ==


Sa aruncam o privire asupra codului:
Pentru acest exemplu vom scrie propriul nostru fisier .pro in loc de a folosi parametul <s>project al qmake.
<br /><code> HEADERS = notepad.h<br /> SOURCES = notepad.cpp  main.cpp</code>
<br />Urmatoarele comenzi pentru consola construiesc aplicatia.
<br /><code> qmake<br /> make<br /></code>
<br />h2. Folosirea unei QMainWindow
<br />Multe aplicati ar beneficia din folosirea unei &quot;QMainWindow&amp;quot;:http://doc.qt.nokia.com/latest/qmainwindow.html, care are propriul layout pe care putem adauga: bari de meniu, bari de instrumente si bara de status. &quot;QMainWindow&amp;quot;:http://doc.qt.nokia.com/latest/qmainwindow.html are o zona centrala in care poate fi adaugat orice widget. In cazul nostru, vom adauga editorul de text aici.
<br />[[Image:http://doc.qt.nokia.com/4.7/images/gs4.png|http://doc.qt.nokia.com/4.7/images/gs4.png]]
<br />Sa aruncam o privire asupra codului:
<br /><code>#include &lt;QtGui&amp;gt;
<br />class Notepad : public QMainWindow<br />{<br /> Q_OBJECT
<br />public:<br /> Notepad();
<br /> private slots:<br /> void open();<br /> void save();<br /> void quit();
<br /> private:<br /> QTextEdit *textEdit;
<br /> QAction *openAction;<br /> QAction *saveAction;<br /> QAction *exitAction;
<br /> QMenu '''fileMenu;<br />};</code>
<br />Adaugam inca doua sloturi pentru salvarea si deschiderea de documente. Le vom implementa in urmatoarea sectiune.
<br />Desi, intr-o fereastra principala, acelasi slot ar trebui invocat de mai multe widget-uri. Exemple sunt elementele din meniuri si butoanele de pe o bara de instrumente. Pentru a face acest lucru mai usor, Qt ofera &quot;QAction&amp;quot;:http://doc.qt.nokia.com/latest/qaction.html, care poate fi furnizat mai multor widget-uri, si pot fi conectate unui slot. De exemplu si &quot;QMenu&amp;quot;:http://doc.qt.nokia.com/latest/qmenu.html si &quot;QToolBar&amp;quot;:http://doc.qt.nokia.com/latest/qtoolbar.html pot crea elemente de meniu si butoane pe bara de instrumente din aceleasi &quot;QAction&amp;quot;:http://doc.qt.nokia.com/latest/qaction.htmls. Vom vedea cum functioneaza acest lucru in curand.
<br />Ca si adineaori folosim contructorul clasei Notepad pentru a seta interfata grafica.
<br /><code>Notepad::Notepad()<br />{<br /> saveAction = new QAction(tr(&quot;&amp;Open&amp;quot;), this);<br /> saveAction = new QAction(tr(&quot;&amp;Save&amp;quot;), this);<br /> exitAction = new QAction(tr(&quot;E&amp;amp;xit&amp;quot;), this);
<br /> connect(openAction, SIGNAL (triggered()), this, SLOT (open()));<br /> connect(saveAction, SIGNAL (triggered()), this, SLOT (save()));<br /> connect(exitAction, SIGNAL (triggered()), qApp, SLOT (quit()));
<br /> fileMenu = menuBar()<s>&gt;addMenu(tr(&quot;&amp;File&amp;quot;));<br /> fileMenu</s>&gt;addAction(openAction);<br /> fileMenu-&gt;addAction(saveAction);<br /> fileMenu-&gt;addSeparator();<br /> fileMenu-&gt;addAction(exitAction);
<br /> textEdit = new QTextEdit;<br /> setCentralWidget(textEdit);
<br /> setWindowTitle(tr(&quot;Notepad&amp;quot;));<br />}</code>
<br />&quot;QAction&amp;quot;:http://doc.qt.nokia.com/latest/qaction.htmls sunt create cu textul cu care ar trebui sa apara pe widget-uri (in cazul nostru, elemente din meniu). Daca dorim putem sa le adaugam si pe o bara de instrumente si sa le adaugam &quot;iconite&amp;quot;:http://doc.qt.nokia.com/latest/qicon.html
<br />Cand un element din meniu este apasat, acesta va activa slotul care va determina invocarea slotului.
<br />h3. Studiati in continuare
<br />''' Ferestre principale si clase pentru ferestre principale</s> &quot;Ferestre principale pentru aplicatii&amp;quot;:http://doc.qt.nokia.com/latest/mainwindow.html, &quot;Exemple de ferestre principale&amp;quot;:http://doc.qt.nokia.com/latest/examples-mainwindow.html<br />* Aplicati MDI - &quot;QMdiArea&amp;quot;:http://doc.qt.nokia.com/latest/qmdiarea.html, &quot;Exemple MDI&amp;quot;:http://doc.qt.nokia.com/latest/mainwindows-mdi.html


Adaugam inca doua sloturi pentru salvarea si deschiderea de documente. Le vom implementa in urmatoarea sectiune.
== Salvarea si deschiderea ==
 
Desi, intr-o fereastra principala, acelasi slot ar trebui invocat de mai multe widget-uri. Exemple sunt elementele din meniuri si butoanele de pe o bara de instrumente. Pentru a face acest lucru mai usor, Qt ofera [http://doc.qt.nokia.com/latest/qaction.html QAction] ''[doc.qt.nokia.com]'', care poate fi furnizat mai multor widget-uri, si pot fi conectate unui slot. De exemplu si [http://doc.qt.nokia.com/latest/qmenu.html QMenu] ''[doc.qt.nokia.com]'' si [http://doc.qt.nokia.com/latest/qtoolbar.html QToolBar] ''[doc.qt.nokia.com]'' pot crea elemente de meniu si butoane pe bara de instrumente din aceleasi [http://doc.qt.nokia.com/latest/qaction.htmls QAction] ''[doc.qt.nokia.com]''. Vom vedea cum functioneaza acest lucru in curand.
 
Ca si adineaori folosim contructorul clasei Notepad pentru a seta interfata grafica.
 
[http://doc.qt.nokia.com/latest/qaction.htmls QAction] ''[doc.qt.nokia.com]'' sunt create cu textul cu care ar trebui sa apara pe widget-uri (in cazul nostru, elemente din meniu). Daca dorim putem sa le adaugam si pe o bara de instrumente si sa le adaugam [http://doc.qt.nokia.com/latest/qicon.html iconite] ''[doc.qt.nokia.com]''
 
Cand un element din meniu este apasat, acesta va activa slotul care va determina invocarea slotului.
 
===Studiati in continuare===
 
* Ferestre principale si clase pentru ferestre principale – [http://doc.qt.nokia.com/latest/mainwindow.html Ferestre principale pentru aplicatii] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/latest/examples-mainwindow.html Exemple de ferestre principale] ''[doc.qt.nokia.com]''
* Aplicati <span class="caps">MDI</span> – [http://doc.qt.nokia.com/latest/qmdiarea.html QMdiArea] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/latest/mainwindows-mdi.html Exemple <span class="caps">MDI</span>] ''[doc.qt.nokia.com]''
 
==Salvarea si deschiderea==


In acest eexmplu vom implementa functionalitatea pentru slot-urile open() si save() care le-am adaugat in exemplul anterior.
In acest eexmplu vom implementa functionalitatea pentru slot-urile open() si save() care le-am adaugat in exemplul anterior.


[[Image:gs5.png]]
[[Image:http://doc.qt.nokia.com/4.7/images/gs5.png|http://doc.qt.nokia.com/4.7/images/gs5.png]]


Vom incepe cu slot-ul open().
Vom incepe cu slot-ul open().


Primul pas este intrebarea utilizatorului care va fi numele fisierului ce va fi deschis. Qt ofera [http://doc.qt.nokia.com/latest/qfiledialog.html QFileDialog] ''[doc.qt.nokia.com]'', care est o fereastra de dialog din care utilizatorul poate selecta un fisier. Imaginea de adineauri arata aceasta ferestra de dialog pe Kubuntu. Functia statica [http://doc.qt.nokia.com/latest/qfiledialog.html#getOpenFileName getOpenFileName()] ''[doc.qt.nokia.com]'' afiseaza o fereastra de dialog modala si nu returneaza pana in momentul in care utilizatorul alege un fisier. Aceasta returneaza calea catre fisierul selectat sau un sir de caractere gol daca utilizatorul a inchis fereastra fara sa selecteze nimic.
<code>QString fileName = QFileDialog::getOpenFileName(this, tr(&quot;Open File&amp;quot;), &quot;&quot;,<br /> tr(&quot;Text Files ('''.txt);;C++ Files ('''.cpp '''.h)&quot;));
 
<br />if (fileName != &quot;&quot;) {<br /> QFile file&amp;amp;#40;fileName&amp;amp;#41;;<br /> if (!file.open(QIODevice::ReadOnly)) {<br /> QMessageBox::critical(this, tr(&quot;Error&amp;quot;),<br /> tr(&quot;Could not open file&amp;quot;));<br /> return;<br /> }<br /> QString contents = file.readAll().constData();<br /> textEdit-&gt;setPlainText(contents);<br /> file.close();<br />}</code>
Daca avem un nume de fisier, incercam sa il deschidem folosind functia [http://doc.qt.nokia.com/latest/qiodevice.html#open open()] ''[doc.qt.nokia.com]'', care returneaza true daca fisierul a fost deschis. Nu vom intra aici in modalitati de tratare a erorilor dar puteti urmari link-uri din sectiunea studiati in continuare. Daca fisierul nu a fost deschis, folosim un [http://doc.qt.nokia.com/latest/qmessagebox.html QMessageBox] ''[doc.qt.nokia.com]'' pentru a afista un mesaj de eroare (vedeti documentatia [http://doc.qt.nokia.com/latest/qmessagebox.html QMessageBox] ''[doc.qt.nokia.com]'' pentru mai multe detalii).
<br />Primul pas este intrebarea utilizatorului care va fi numele fisierului ce va fi deschis. Qt ofera &quot;QFileDialog&amp;quot;:http://doc.qt.nokia.com/latest/qfiledialog.html, care est o fereastra de dialog din care utilizatorul poate selecta un fisier. Imaginea de adineauri arata aceasta ferestra de dialog pe Kubuntu. Functia statica &quot;getOpenFileName()&quot;:http://doc.qt.nokia.com/latest/qfiledialog.html#getOpenFileName afiseaza o fereastra de dialog modala si nu returneaza pana in momentul in care utilizatorul alege un fisier. Aceasta returneaza calea catre fisierul selectat sau un sir de caractere gol daca utilizatorul a inchis fereastra fara sa selecteze nimic.
 
<br />Daca avem un nume de fisier, incercam sa il deschidem folosind functia &quot;open()&quot;:http://doc.qt.nokia.com/latest/qiodevice.html#open, care returneaza true daca fisierul a fost deschis. Nu vom intra aici in modalitati de tratare a erorilor dar puteti urmari link-uri din sectiunea studiati in continuare. Daca fisierul nu a fost deschis, folosim un &quot;QMessageBox&amp;quot;:http://doc.qt.nokia.com/latest/qmessagebox.html pentru a afista un mesaj de eroare (vedeti documentatia &quot;QMessageBox&amp;quot;:http://doc.qt.nokia.com/latest/qmessagebox.html pentru mai multe detalii).
Citirea datelor din fisier este triviala folosind functia [http://doc.qt.nokia.com/latest/qiodevice.html#readAll readAll()] ''[doc.qt.nokia.com]'', care returneaza toate datele din fisier sub forma unui [http://doc.qt.nokia.com/latest/qbytearray.html QByteArray] ''[doc.qt.nokia.com]''. Functia [http://doc.qt.nokia.com/latest/qbytearray.html#constData constData()] ''[doc.qt.nokia.com]'' returneaza date ca si const char*, pentru care [http://doc.qt.nokia.com/latest/qstring.html QString] ''[doc.qt.nokia.com]'' are constructor. Continutul poate fi apoi afist in editorul de text. Inchidem apoi fisierul folosind [http://doc.qt.nokia.com/latest/qiodevice.html#close close()] ''[doc.qt.nokia.com]'' pentru a returna descriptorul inapoi sistemului de operare.
<br />Citirea datelor din fisier este triviala folosind functia &quot;readAll()&quot;:http://doc.qt.nokia.com/latest/qiodevice.html#readAll, care returneaza toate datele din fisier sub forma unui &quot;QByteArray&amp;quot;:http://doc.qt.nokia.com/latest/qbytearray.html. Functia &quot;constData()&quot;:http://doc.qt.nokia.com/latest/qbytearray.html#constData returneaza date ca si const char''', pentru care &quot;QString&amp;quot;:http://doc.qt.nokia.com/latest/qstring.html are constructor. Continutul poate fi apoi afist in editorul de text. Inchidem apoi fisierul folosind &quot;close()&quot;:http://doc.qt.nokia.com/latest/qiodevice.html#close pentru a returna descriptorul inapoi sistemului de operare.


Acum sa trecem la slot-ul save().
Acum sa trecem la slot-ul save().


Cand scriem continutul editorului de text intr-un fisier, folosim clasa [http://doc.qt.nokia.com/latest/qtextstream.html QTextStream] ''[doc.qt.nokia.com]'', care incapsuleaza un obiect [http://doc.qt.nokia.com/latest/qfile.html QFile] ''[doc.qt.nokia.com]''. QTextStream poate sa scrie direct QString in fisier; [http://doc.qt.nokia.com/latest/qfile.html QFile] ''[doc.qt.nokia.com]'' accepta doar date neprelucrate (char*) cu functile [http://doc.qt.nokia.com/latest/qiodevice.html#write write()] ''[doc.qt.nokia.com]'' a unui [http://doc.qt.nokia.com/latest/qiodevice.html <span class="caps">QIOD</span>evice] ''[doc.qt.nokia.com]''
<code>QString fileName = QFileDialog::getSaveFileName(this, tr(&quot;Save File&amp;quot;), &quot;&quot;,<br /> tr(&quot;Text Files ('''.txt);;C++ Files ('''.cpp '''.h)&quot;));
 
<br />if (fileName != &quot;&quot;) {<br /> QFile file&amp;amp;#40;fileName&amp;amp;#41;;<br /> if (!file.open(QIODevice::WriteOnly)) {<br /> // error message<br /> } else {<br /> QTextStream stream(&amp;file);<br /> stream &lt;&lt; textEdit-&gt;toPlainText();<br /> stream.flush();<br /> file.close();<br /> }<br />}</code>
===Studiati in continuare===
<br />Cand scriem continutul editorului de text intr-un fisier, folosim clasa &quot;QTextStream&amp;quot;:http://doc.qt.nokia.com/latest/qtextstream.html, care incapsuleaza un obiect &quot;QFile&amp;quot;:http://doc.qt.nokia.com/latest/qfile.html. QTextStream poate sa scrie direct QString in fisier; &quot;QFile&amp;quot;:http://doc.qt.nokia.com/latest/qfile.html accepta doar date neprelucrate (char''') cu functile &quot;write()&quot;:http://doc.qt.nokia.com/latest/qiodevice.html#write a unui &quot;QIODevice&amp;quot;:http://doc.qt.nokia.com/latest/qiodevice.html
 
* Fisiere si dispozitive I/O – [http://doc.qt.nokia.com/latest/qfile.html QFile] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/latest/qiodevice.html <span class="caps">QIOD</span>evice] ''[doc.qt.nokia.com]''
 
===Categories:===


* [[:Category:Learning|Learning]]
=== Studiati in continuare ===

Revision as of 11:07, 24 February 2015


Notiuni de baza pentru programare cu Qt

Bun venit in lumea Qt—toolkitul GUI multi-platforma. In acest articol de introducere vom prezenta notiuni de baza pentru programarea cu Qt prin implementarea unei simple aplicatii Notepad. Dupa citirea acestui ghid veti fi pregatiti sa rasfoiti documentatia noastra si sa gasiti informatiile necesare pentru aplicatia pe care o dezvoltati.

Hello Notepad

In acest prim exemplu vom crea un simplu editor de text intr-o fereastra. Acesta reprezinta cel mai simplu program Qt cu interfata grafica.

Notepad

Codul necesar pentru a crea aplicatia:

#include &lt;QApplication&amp;gt;<br />#include &lt;QTextEdit&amp;gt;

int main(int argv, char *'''args)<br />{<br /> QApplication app(argv, args);
<br /> QTextEdit textEdit;<br /> textEdit.show();
<br /> return app.exec&amp;amp;#40;&amp;#41;;<br />}


Sa urmarim codul line cu line. In primele doua linii includem fisierele hedear "QApplication&quot;:http://doc.trolltech.com/latest/qapplication.html si "QTextEdit&quot;:http://doc.trolltech.com/latest/qtextedit.html, acestea fiind clasele de care avem nevoie pentru aceasta aplicatie. Toate clasele din Qt au un header denumit dupa ele.
Linia 6 creaza o instanta a obiectului "QApplication&quot;:http://doc.trolltech.com/latest/qapplication.html. Acest obiect gestioneaza resursele aplicatiei si este neccesar pentru a rula orice aplicatie Qt care are o interfata grafica. Acesta ia ca parametri argv si args pentru ca Qt accepta cativa parametrii de start.
Linia 8 creaza un obiect de tip "QTextEdit&quot;:http://doc.trolltech.com/latest/qtextedit.html. Un editor de text este un element vizual in interfata grafica (GUI). In Qt aceste elemente se numesc widget-uri. Exemple de widget-uri sunt etichete, butoane radio, bare de derulare. Un widget poate fi deasemena si un container pentru alte widget-uri; o casuta de dialog sau o fereastra principala a aplicatiei de exemplu.
Linia 9 arata editorul de text in propria lui fereastra. Deoarece widget-urile pot fi si container (de exemplu "QMainWindow&quot;:http://doc.qt.nokia.com/latest/qmainwindow.html care contine bare de instrumente, meniuri, bara de stare si alte widgeturi), este posibila afisarea unui singur widget in propria sa fereastra. Widget-urile nu sunt vizibile implicit functia "show()":http://doc.qt.nokia.com/latest/qwidget.html#show face widget-ul vizibil.
Linia 11 face ca obiectul "QApplication&quot;:http://doc.trolltech.com/latest/qapplication.html sa intre in bucla de evenimente. Cand o aplicatie Qt ruleaza, evenimente sunt generate si trimise widget-urilor care apartin de aplicatie. Exemple de astfel de evenimente sunt apasari ale butoanelor de la mouse sau apsari a butoanelor de la tastatura. Im momentul in care tastati text in editorul de text, acesta primeste evenimentele generate in urma apasari tastelor si raspunde la aceste evenimente desenand text pe ecran.
Pentru a rula aplicatia, deschideti o consola, intrati in directorul unde ati salvat fisierul .cpp. Urmatoarele comenzi vor construi aplicatia.


qmake -projetc<br />qmake<br />make


Aceste comenzi vor genera un executabil in directorul part1 (atentie pe windows e posibil sa fie nevoie sa rulati comanda nmake in loc de make. De asemenea executabilul va fi plasat ub folderul part1/debug sau part1/release). qmake este un utilitar care ia ca si parametru un fisier de configurare. qmake genereaza pentru noi acest fisier de configurare cand este rulat cu parametru project. Odata generat fisierul de configurare (cu extensia .pro) qmake produce un fisier make care va construi programul pentru noi. Vom studia cum putem scrie propriile noastre fisiere .pro mai tarziu.
h3. Studiati in continuare
* Widget-rui si geometria acestora
"Widget-uri ferestre si dialoguri&quot;:http://doc.qt.nokia.com/latest/application-windows.html
Evenimente si modul de tratare a acestora - "Sistemul de evenimente&quot;:http://doc.qt.nokia.com/latest/eventsandfilters.html

Adaugarea unu button de iesire

Intr-o aplicatie reala, avem nevoie de mai multe widget-uri. Vom introduce un "QPushButton&quot;:http://doc.qt.nokia.com/latest/qpushbutton.html sub editorul de text. Butonul va opri aplicatia in momentul in care este apasat (facand click cu mouse pe el,de exemplu).

Notepad

Sa aruncam o privire asupra codului:

#include &lt;QtGui&amp;gt;

int main(int argv, char **args)<br />{<br /> QApplication app(argv, args);

QTextEdit textEdit;<br /> QPushButton quitButton(&quot;Quit&amp;quot;);

QObject::connect(&amp;quitButton, SIGNAL (clicked()), qApp, SLOT (quit()));

QVBoxLayout layout;<br /> layout.addWidget(&amp;textEdit);<br /> layout.addWidget(&amp;quitButton);

QWidget window;<br /> window.setLayout(&amp;layout);

window.show();

return app.exec&amp;amp;#40;&amp;#41;;<br />}

Linia 1 include "QtGui&quot;:http://doc.qt.nokia.com/latest/qtgui.html, care contine toate clasele GUI din Qt.

Linia 10 foloseste mecanismul signal slot din Qt pentru a face aplicatia sa se inchida in momentul in care Butonul Quit este apasat. Un slot este o functie care poate fi invocata in timpul executiei folosind numele ei (ca un sir de caractere literal). Un semnal este o functie care in momentul invocarii apeleaza toate slot-urile inregistrate cu acesta; apelam acestea pentru a conecta slotul la semnal si a emite semnalul.

"quit()":http://doc.qt.nokia.com/latest/qcoreapplication.html#quit este un slot a "QApplication&quot;:http://doc.trolltech.com/latest/qapplication.html care intrerupe executia aplicatiei. "clicked()":http://doc.qt.nokia.com/latest/qabstractbutton.html#clicked este un semnal emis de QPushButton&quot;:http://doc.qt.nokia.com/latest/qpushbutton.html in momentul in care acesta este apasat. Functia statica "QObject::connect()":http://doc.qt.nokia.com/latest/qobject.html#connect va conecta slotul la semnal. SIGNAL () si SLOT() sunt doua macro-uri care iau ca parametrii semnaturile functilor care reprezinta semnalul si slotul care vor fi conectate. De asemenea trebuie sa furnizam si pointeri catre obiectele care vor emite si receptiona semnalul.

Linia 12 creaza un "QVBoxLayout&quot;:http://doc.qt.nokia.com/latest/qvboxlayout.html. Precum am mentionat adineauri, widget-urile pot contine alte widget-uri. Este posibila setarea locatiei si a dimensiunilor a widget-urilor continute direct, dar de obicei este mai usor folosirea unui layout. Un layout gestioneaza locatia si dimensiunea widget-urilor. "QVBoxLayout&quot;:http://doc.qt.nokia.com/latest/qvboxlayout.html , de exemplu, aseaza widget-urile intr-un rand pe verticala.

Linia 13 si 14 adauga editorul de text si butonul in layout iar linia 17 seteaza layoutul pe widget.

Studiati in continuare

Derivarea din QWidget

In momentul in care utilizatorul vrea sa inchida aplicatia, e posibil sa doriti sa afisati un mesaj intreband utilizatorul daca el/ea chiar doreste sa inchida aplicatia. In acest exemplu, vom deriva din "QWidget&quot;:http://doc.qt.nokia.com/latest/qwidget.html si vom adauga un slot pe care il vom conecta la buton de Quit.

http://doc.qt.nokia.com/4.7/images/gs3.png

Sa aruncam o privire asupra codului:

class Notepad : public QWidget<br />{<br /> Q_OBJECT

public:<br /> Notepad();

private slots:<br /> void quit();

private:<br /> QTextEdit *textEdit;<br /> QPushButton *quitButton;<br />};

Macroul Q_OBJECT trebuie definit primul in clasa, acesta declara clasa noastra ca fiind un QObject (Normal trebuie sa si mostenim din "QObject&quot;:http://doc.qt.nokia.com/latest/qobject.html). Un "QObject&quot;:http://doc.qt.nokia.com/latest/qobject.html adauga cateva abilitati unei clase normale de C++. Notbail este ca numele clasei si numele sloturi-lor pot fi interogate in timpul executiei. Este posibil deasemenea interogarea tipului parametrilor unui slot si invocarea acestuia.

Linia 13 declara slotul quit(). Acest lucru este usor flosind macroul slots. Slot-ul quit() poate fi acum conectat la semnale care au acelasi numar si tip de parametri (orice semnal ce nu ia parametri in cazul nostru).
In loc de a seta interfata grafica si a conecta slot-ul in main, vom folosi constructorul clasei Notepad.

Notepad::Notepad()<br />{<br /> textEdit = new QTextEdit;<br /> quitButton = new QPushButton(tr(&quot;Quit&amp;quot;));

connect(quitButton, SIGNAL (clicked()), this, SLOT (quit()));

QVBoxLayout '''layout = new QVBoxLayout;<br /> layout-&gt;addWidget(textEdit);<br /> layout-&gt;addWidget(quitButton);
<br /> setLayout(layout);
<br /> setWindowTitle(tr(&quot;Notepad&amp;quot;));<br />}


Dupa cum se poate vedea in definitia clasei, folosim pointeri catre obiectele noastre de tip "QObject&quot;:http://doc.qt.nokia.com/latest/qobject.html (textEdit si quitButton). Ca o regula, este indicata alocarea obiectelor "QObject&quot;:http://doc.qt.nokia.com/latest/qobject.html pe heap si necopierea acestora.
Putem folosi acum functia "tr()":http://doc.qt.nokia.com/latest/qobject.html#tr pentru a incapsula sirurile de caractere vizibile. Acest lucru este necesar daca dorim distribuirea aplicatiei in mai mult de o limba (Engleza si Chineza de exemplu). Nu vom intra in detalii aici, dar puteti sa urmati linkurile de mai jos pentru a afla mai multe.
h3. Studiati in continuare
tr() si internationalizarea - "Manual Qt Linguist&quot;:http://doc.qt.nokia.com/latest/linguist-manual.html, "Scrierea de cod pentru traduceri&quot;:http://doc.qt.nokia.com/latest/i18n-source-translation.html, "Exemplul Hello tr()":http://doc.qt.nokia.com/latest/linguist-hellotr.html, "Internationalizarea cu Qt&quot;:http://doc.qt.nokia.com/latest/internationalization.html
* "QObjects&quot;:http://doc.qt.nokia.com/latest/qobject.html si modelul Qt pentru obiecte (Acest lucru este necesar pentru a intelege Qt) - "Modelul de Obiecte&quot;:http://doc.qt.nokia.com/latest/object.html
* qmake si sistem de constructie Qt - "Manual qmake&quot;:http://doc.qt.nokia.com/latest/qmake-manual.html

Crearea unui fisier .pro

Pentru acest exemplu vom scrie propriul nostru fisier .pro in loc de a folosi parametul project al qmake.


 HEADERS = notepad.h<br /> SOURCES = notepad.cpp  main.cpp


Urmatoarele comenzi pentru consola construiesc aplicatia.


 qmake<br /> make<br />


h2. Folosirea unei QMainWindow
Multe aplicati ar beneficia din folosirea unei "QMainWindow&quot;:http://doc.qt.nokia.com/latest/qmainwindow.html, care are propriul layout pe care putem adauga: bari de meniu, bari de instrumente si bara de status. "QMainWindow&quot;:http://doc.qt.nokia.com/latest/qmainwindow.html are o zona centrala in care poate fi adaugat orice widget. In cazul nostru, vom adauga editorul de text aici.
http://doc.qt.nokia.com/4.7/images/gs4.png
Sa aruncam o privire asupra codului:


#include &lt;QtGui&amp;gt;
<br />class Notepad : public QMainWindow<br />{<br /> Q_OBJECT
<br />public:<br /> Notepad();
<br /> private slots:<br /> void open();<br /> void save();<br /> void quit();
<br /> private:<br /> QTextEdit *textEdit;
<br /> QAction *openAction;<br /> QAction *saveAction;<br /> QAction *exitAction;
<br /> QMenu '''fileMenu;<br />};


Adaugam inca doua sloturi pentru salvarea si deschiderea de documente. Le vom implementa in urmatoarea sectiune.
Desi, intr-o fereastra principala, acelasi slot ar trebui invocat de mai multe widget-uri. Exemple sunt elementele din meniuri si butoanele de pe o bara de instrumente. Pentru a face acest lucru mai usor, Qt ofera "QAction&quot;:http://doc.qt.nokia.com/latest/qaction.html, care poate fi furnizat mai multor widget-uri, si pot fi conectate unui slot. De exemplu si "QMenu&quot;:http://doc.qt.nokia.com/latest/qmenu.html si "QToolBar&quot;:http://doc.qt.nokia.com/latest/qtoolbar.html pot crea elemente de meniu si butoane pe bara de instrumente din aceleasi "QAction&quot;:http://doc.qt.nokia.com/latest/qaction.htmls. Vom vedea cum functioneaza acest lucru in curand.
Ca si adineaori folosim contructorul clasei Notepad pentru a seta interfata grafica.


Notepad::Notepad()<br />{<br /> saveAction = new QAction(tr(&quot;&amp;Open&amp;quot;), this);<br /> saveAction = new QAction(tr(&quot;&amp;Save&amp;quot;), this);<br /> exitAction = new QAction(tr(&quot;E&amp;amp;xit&amp;quot;), this);
<br /> connect(openAction, SIGNAL (triggered()), this, SLOT (open()));<br /> connect(saveAction, SIGNAL (triggered()), this, SLOT (save()));<br /> connect(exitAction, SIGNAL (triggered()), qApp, SLOT (quit()));
<br /> fileMenu = menuBar()<s>&gt;addMenu(tr(&quot;&amp;File&amp;quot;));<br /> fileMenu</s>&gt;addAction(openAction);<br /> fileMenu-&gt;addAction(saveAction);<br /> fileMenu-&gt;addSeparator();<br /> fileMenu-&gt;addAction(exitAction);
<br /> textEdit = new QTextEdit;<br /> setCentralWidget(textEdit);
<br /> setWindowTitle(tr(&quot;Notepad&amp;quot;));<br />}


"QAction&quot;:http://doc.qt.nokia.com/latest/qaction.htmls sunt create cu textul cu care ar trebui sa apara pe widget-uri (in cazul nostru, elemente din meniu). Daca dorim putem sa le adaugam si pe o bara de instrumente si sa le adaugam "iconite&quot;:http://doc.qt.nokia.com/latest/qicon.html
Cand un element din meniu este apasat, acesta va activa slotul care va determina invocarea slotului.
h3. Studiati in continuare
Ferestre principale si clase pentru ferestre principale
"Ferestre principale pentru aplicatii&quot;:http://doc.qt.nokia.com/latest/mainwindow.html, "Exemple de ferestre principale&quot;:http://doc.qt.nokia.com/latest/examples-mainwindow.html
* Aplicati MDI - "QMdiArea&quot;:http://doc.qt.nokia.com/latest/qmdiarea.html, "Exemple MDI&quot;:http://doc.qt.nokia.com/latest/mainwindows-mdi.html

Salvarea si deschiderea

In acest eexmplu vom implementa functionalitatea pentru slot-urile open() si save() care le-am adaugat in exemplul anterior.

http://doc.qt.nokia.com/4.7/images/gs5.png

Vom incepe cu slot-ul open().

QString fileName = QFileDialog::getOpenFileName(this, tr(&quot;Open File&amp;quot;), &quot;&quot;,<br /> tr(&quot;Text Files ('''.txt);;C++ Files ('''.cpp '''.h)&quot;));
<br />if (fileName != &quot;&quot;) {<br /> QFile file&amp;amp;#40;fileName&amp;amp;#41;;<br /> if (!file.open(QIODevice::ReadOnly)) {<br /> QMessageBox::critical(this, tr(&quot;Error&amp;quot;),<br /> tr(&quot;Could not open file&amp;quot;));<br /> return;<br /> }<br /> QString contents = file.readAll().constData();<br /> textEdit-&gt;setPlainText(contents);<br /> file.close();<br />}


Primul pas este intrebarea utilizatorului care va fi numele fisierului ce va fi deschis. Qt ofera "QFileDialog&quot;:http://doc.qt.nokia.com/latest/qfiledialog.html, care est o fereastra de dialog din care utilizatorul poate selecta un fisier. Imaginea de adineauri arata aceasta ferestra de dialog pe Kubuntu. Functia statica "getOpenFileName()":http://doc.qt.nokia.com/latest/qfiledialog.html#getOpenFileName afiseaza o fereastra de dialog modala si nu returneaza pana in momentul in care utilizatorul alege un fisier. Aceasta returneaza calea catre fisierul selectat sau un sir de caractere gol daca utilizatorul a inchis fereastra fara sa selecteze nimic.
Daca avem un nume de fisier, incercam sa il deschidem folosind functia "open()":http://doc.qt.nokia.com/latest/qiodevice.html#open, care returneaza true daca fisierul a fost deschis. Nu vom intra aici in modalitati de tratare a erorilor dar puteti urmari link-uri din sectiunea studiati in continuare. Daca fisierul nu a fost deschis, folosim un "QMessageBox&quot;:http://doc.qt.nokia.com/latest/qmessagebox.html pentru a afista un mesaj de eroare (vedeti documentatia "QMessageBox&quot;:http://doc.qt.nokia.com/latest/qmessagebox.html pentru mai multe detalii).
Citirea datelor din fisier este triviala folosind functia "readAll()":http://doc.qt.nokia.com/latest/qiodevice.html#readAll, care returneaza toate datele din fisier sub forma unui "QByteArray&quot;:http://doc.qt.nokia.com/latest/qbytearray.html. Functia "constData()":http://doc.qt.nokia.com/latest/qbytearray.html#constData returneaza date ca si const char, pentru care "QString&quot;:http://doc.qt.nokia.com/latest/qstring.html are constructor. Continutul poate fi apoi afist in editorul de text. Inchidem apoi fisierul folosind "close()":http://doc.qt.nokia.com/latest/qiodevice.html#close pentru a returna descriptorul inapoi sistemului de operare.

Acum sa trecem la slot-ul save().

QString fileName = QFileDialog::getSaveFileName(this, tr(&quot;Save File&amp;quot;), &quot;&quot;,<br /> tr(&quot;Text Files ('''.txt);;C++ Files ('''.cpp '''.h)&quot;));
<br />if (fileName != &quot;&quot;) {<br /> QFile file&amp;amp;#40;fileName&amp;amp;#41;;<br /> if (!file.open(QIODevice::WriteOnly)) {<br /> // error message<br /> } else {<br /> QTextStream stream(&amp;file);<br /> stream &lt;&lt; textEdit-&gt;toPlainText();<br /> stream.flush();<br /> file.close();<br /> }<br />}


Cand scriem continutul editorului de text intr-un fisier, folosim clasa "QTextStream&quot;:http://doc.qt.nokia.com/latest/qtextstream.html, care incapsuleaza un obiect "QFile&quot;:http://doc.qt.nokia.com/latest/qfile.html. QTextStream poate sa scrie direct QString in fisier; "QFile&quot;:http://doc.qt.nokia.com/latest/qfile.html accepta doar date neprelucrate (char) cu functile "write()":http://doc.qt.nokia.com/latest/qiodevice.html#write a unui "QIODevice&quot;:http://doc.qt.nokia.com/latest/qiodevice.html

Studiati in continuare