Getting Started on the Commandline/hr: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
No edit summary
Line 1: Line 1:
Pregledajte ovu stranicu na sljedećim jezicima: [http://doc.qt.nokia.com/4.7/gettingstartedqt.html en] ''[doc.qt.nokia.com]'', [http://developer.qt.nokia.com/wiki/GettingStartedQt_Spanish es] ''[developer.qt.nokia.com]'', [http://developer.qt.nokia.com/wiki/GettingStartedWithQtRussian ru] ''[developer.qt.nokia.com]'', [http://developer.qt.nokia.com/wiki/GettingStartedQtPolish pl] ''[developer.qt.nokia.com]'', [http://developer.qt.nokia.com/wiki/gettingStartedPortuguese pt] ''[developer.qt.nokia.com]'', [http://developer.qt.nokia.com/wiki/GettingStartedQtDutch nl] ''[developer.qt.nokia.com]''
Pregledajte ovu stranicu na sljedećim jezicima: "en":http://doc.qt.nokia.com/4.7/gettingstartedqt.html, "es":http://developer.qt.nokia.com/wiki/GettingStartedQt_Spanish, "ru":http://developer.qt.nokia.com/wiki/GettingStartedWithQtRussian, "pl":http://developer.qt.nokia.com/wiki/GettingStartedQtPolish, "pt":http://developer.qt.nokia.com/wiki/gettingStartedPortuguese, "nl":http://developer.qt.nokia.com/wiki/GettingStartedQtDutch


=Početak programiranja u Qt=
[toc align_right="yes" depth="2"]


Dobrodošli u svijet Qt-a— više platformskog <span class="caps">GUI</span> frameworka. U ovom vodiču proći ćemo osnove Qt izradom jednostavne Notepad aplikacije.
= Početak programiranja u Qt =


==Pozdrav Notepad==
Dobrodošli u svijet Qt-a— više platformskog GUI frameworka. U ovom vodiču proći ćemo osnove Qt izradom jednostavne Notepad aplikacije.
 
== Pozdrav Notepad ==


U prvom primjeru pokazat ćemo kako kreirati i prikazati editor teksta unutar prozora na desktopu. To je najednostavnija upotreba Qt-a u radu s korisničkim sučeljem.
U prvom primjeru pokazat ćemo kako kreirati i prikazati editor teksta unutar prozora na desktopu. To je najednostavnija upotreba Qt-a u radu s korisničkim sučeljem.


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


Izvorni kod aplikacije:<br /> Idemo proci kroz izvorni kod aplikacije red po red. U prve dvije linije koda, dodajemo header datoteke za [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] ''[doc.qt.nokia.com]'' i [http://doc.qt.nokia.com/4.7/qtextedit.html QTextEdit] ''[doc.qt.nokia.com]'', dvije klase koje su nam potrebne za ovaj primjer. Sve Qt klase imaju header datoteku s ####### klase.
Izvorni kod aplikacije:<br /><code><br />#include &lt;QApplication&amp;gt;<br />#include &lt;QTextEdit&amp;gt;


U redu 6. aplikacije kreiramo [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] ''[doc.qt.nokia.com]'' objekt. Ovaj objekt upravlja svim resursima na razini cijele aplikacije i neophodan je za sve Qt programe koji uključuju korisničko sučelje. Parametri argv i args su mu potrebni s obziorm da Qt prihvaća nekoliko komandnolinijskih parametara.
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 />}<br /></code><br />Idemo proci kroz izvorni kod aplikacije red po red. U prve dvije linije koda, dodajemo header datoteke za &quot;QApplication&amp;quot;:http://doc.qt.nokia.com/4.7/qapplication.html i &quot;QTextEdit&amp;quot;:http://doc.qt.nokia.com/4.7/qtextedit.html, dvije klase koje su nam potrebne za ovaj primjer. Sve Qt klase imaju header datoteku s nazivom klase.
<br />U redu 6. aplikacije kreiramo &quot;QApplication&amp;quot;:http://doc.qt.nokia.com/4.7/qapplication.html objekt. Ovaj objekt upravlja svim resursima na razini cijele aplikacije i neophodan je za sve Qt programe koji uključuju korisničko sučelje. Parametri argv i args su mu potrebni s obziorm da Qt prihvaća nekoliko komandnolinijskih parametara.
<br />Red 8 kreira &quot;QTextEdit&amp;quot;:http://doc.qt.nokia.com/4.7/qtextedit.html objekt. Text Edit je vizualni element u koriničkom sučelju. U Qt, takve objekte nazivamo widgetima. Orimjeri drugih widgeta su scroll barovi, dugmad i tekst elementi. Widget je istovremeno može sadrćavati i druge widgete; dialog ili glavni prozor aplikacije.
<br />Red 9 prikazuje Text Edit na ekranu unutar prozora aplikacije. S obzirom da widgeti istovremeno mogu u sebi sadržavati druge widgete (instanca &quot;QMainWindow&amp;quot;:http://doc.qt.nokia.com/4.7/qmainwindow.htm u sebi sadrži traku s alatima, menije, statusnu traku kao i druge widgete), moguće je prikazati svaki widget unutar njegovog vlastitog prozora. Widgeti pri samom kreiranju nisu vidljivi već ih se mora prikazati upotrebnom funkcije .show().
<br />U redu 11 &quot;QApplication&amp;quot;:http://doc.qt.nokia.com/4.7/qapplication.html ulazi u glavnu petlju u kojoj lovi događaje(eventove). Za vrijeme izvršavanja Qt aplikacije, eventovi se kreiraju i šalju widgetima unutar aplikacije. Primjeri događaja su pritisak na tipku miša ili unos na tipkovnici. Dok upisujete tekst u TextEdit widget, on prima event koji mu govori da je pritisnuta tipka i koja tipka je pritisnuta i zatim u skladu s time iscratava se upisani tekst.
<br />Da bi pokrenuli aplikaciju, otvorite komadnu liniju, pronađite direktorij u kojem se nalazi .cpp datoteka programa. —Upišite sljedeće linije da bi pokrenuli program:<br /><code><br /> qmake -project<br /> qmake<br /> make<br /></code>
<br />Pokretanje ove skripte kreirat će izvrnu datoteku u part1 direkoriju (korinici Windows opertativnog sustava, umjeto &lt;i&amp;gt;make&amp;lt;/i&amp;gt; komande koristite &lt;i&amp;gt;nmake&amp;lt;/i&amp;gt;. Isto tako, izvrsna datoteka će biti locirana u direktorijima part1/debug i part1/release). QMake je Qt alat za izradu izvršnih datoteka iz konfiguracijskih datoteka. Njih takodjer kreira qmake upotrebom -project paramtera. Iz konfiguracijske datoteke (sa sufiksom .pro), qmake kreira &lt;/&amp;gt;make&amp;lt;/i&amp;gt; datoteku iz koje će se generirati izvrćna datoteka aplikacije. O pisanju vlastitih .pro datoteka ćemo malo kasnije.
<br />h3. Dodatne informacije<br />|''. Tema |''. Gdje? |<br />| Widgeti i upotreba Window widgeta | &quot;Window and Dialog Widgets&amp;quot;:http://doc.qt.nokia.com/4.7/application-windows.html |<br />| Eventi i rad s njima | &quot;The Event System&amp;quot;:http://doc.qt.nokia.com/4.7/eventsandfilters.html |
<br />h2. Dodavanje tipke za izlak iz programa
<br />Za izradu pravih aplikacija bit će nam potrebno više od jednog widgeta. Zato ćemo sada dodati &quot;QPushButton&amp;quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html ispod Text Edit elementa. Pritiskom na novo dodanu tipku aplikacija će se zatvoriti.
<br />p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs2.png|http://doc.qt.nokia.com/4.7/images/gs2.png]]
<br />Pogledajmo izvorni kod aplikacije.
<br /><code><br />#include &lt;QtGui&amp;gt;
<br />int main(int argv, char'''*args)<br />{<br /> QApplication app(argv, args);


Red 8 kreira [http://doc.qt.nokia.com/4.7/qtextedit.html QTextEdit] ''[doc.qt.nokia.com]'' objekt. Text Edit je vizualni element u koriničkom sučelju. U Qt, takve objekte ######## widgetima. Orimjeri drugih widgeta su scroll barovi, dugmad i tekst elementi. Widget je istovremeno može sadrćavati i druge widgete; dialog ili glavni prozor aplikacije.
QTextEdit textEdit;<br /> QPushButton quitButton(&quot;Izađi&amp;quot;);


Red 9 prikazuje Text Edit na ekranu unutar prozora aplikacije. S obzirom da widgeti istovremeno mogu u sebi sadržavati druge widgete (instanca [http://doc.qt.nokia.com/4.7/qmainwindow.htm QMainWindow] ''[doc.qt.nokia.com]'' u sebi sadrži traku s alatima, menije, statusnu traku kao i druge widgete), moguće je prikazati svaki widget unutar njegovog vlastitog prozora. Widgeti pri samom kreiranju nisu vidljivi već ih se mora prikazati upotrebnom funkcije .show().
QObject::connect(&amp;quitButton, SIGNAL (clicked()), qApp, SLOT (quit()));


U redu 11 [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] ''[doc.qt.nokia.com]'' ulazi u glavnu petlju u kojoj lovi događaje(eventove). Za vrijeme izvršavanja Qt aplikacije, eventovi se kreiraju i šalju widgetima unutar aplikacije. Primjeri događaja su pritisak na tipku miša ili unos na tipkovnici. Dok upisujete tekst u TextEdit widget, on prima event koji mu govori da je pritisnuta tipka i koja tipka je pritisnuta i zatim u skladu s time iscratava se upisani tekst.
QVBoxLayout layout;<br /> layout.addWidget(&amp;textEdit);<br /> layout.addWidget(&amp;quitButton);


Da bi pokrenuli aplikaciju, otvorite komadnu liniju, pronađite direktorij u kojem se nalazi .cpp datoteka programa. —Upišite sljedeće linije da bi pokrenuli program:<br />
QWidget window;<br /> window.setLayout(&amp;layout);


Pokretanje ove skripte kreirat će izvrnu datoteku u part1 direkoriju (korinici Windows opertativnog sustava, umjeto &lt;i&gt;make&lt;/i&gt; komande koristite &lt;i&gt;nmake&lt;/i&gt;. Isto tako, izvrsna datoteka će biti locirana u direktorijima part1/debug i part1/release). QMake je Qt alat za izradu izvršnih datoteka iz konfiguracijskih datoteka. Njih takodjer kreira qmake upotrebom -project paramtera. Iz konfiguracijske datoteke (sa sufiksom .pro), qmake kreira &lt;/&gt;make&lt;/i&gt; datoteku iz koje će se generirati izvrćna datoteka aplikacije. O pisanju vlastitih .pro datoteka ćemo malo kasnije.
window.show();


===Dodatne informacije {| class="infotable line" ! Tema ! Gdje? |- | Widgeti i upotreba Window widgeta | [http://doc.qt.nokia.com/4.7/application-windows.html Window and Dialog Widgets] ''[doc.qt.nokia.com]'' |- | Eventi i rad s njima | [http://doc.qt.nokia.com/4.7/eventsandfilters.html The Event System] ''[doc.qt.nokia.com]'' |}===
return app.exec&amp;amp;#40;&amp;#41;;<br />}<br /></code>


==Dodavanje tipke za izlak iz programa==
U prvom redu dodajemo QtGui header datoteku koja sadrži sve klase potrebne za Qt korisničko sučelje.
 
Za izradu pravih aplikacija bit će nam potrebno više od jednog widgeta. Zato ćemo sada dodati [http://doc.qt.nokia.com/4.7/qpushbutton.html QPushButton] ''[doc.qt.nokia.com]'' ispod Text Edit elementa. Pritiskom na novo dodanu tipku aplikacija će se zatvoriti.


[[Image:gs2.png]]
Red 10 koristi Qt mehanizam za signale i slotove da bi se izvršilo zatvaranje aplikacije klikom miša na tipku za zatvaranje aplikacije. Slot je funkcija koja se izvršava pozivanjem iste koristeći njegzin naziv. Signal je funkcija koja će nakon što je pozvana, pokrenuti slotove koji su vezani na nju; povezujemo slot sa signalom.


Pogledajmo izvorni kod aplikacije.
quite() je slot od &quot;QApplication&amp;quot;:http://doc.qt.nokia.com/4.7/qapplication.html clicked() je signal koji &quot;QPushButton&amp;quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html šalje dok korisniki klikne na njega. Statička metoda QObject::connect() brine se za povezivanje slota i signala. SIGNAL () i SLOT() su dva makroa koji rješavaju povezivanje funkcija signala i slotova. Također, potrebno je dodati pokazivače na objekte koji primaju i šalju signal.


U prvom redu dodajemo QtGui header datoteku koja sadrži sve klase potrebne za Qt korisničko sučelje.
U redu 12 kreiramo &quot;QVboxLayout&amp;quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html. Kao što je prije spomenuto, widgeti mogu u sebi sadržavati druge widgete. Moguće je postaviti granice (položaj i veličinu) direktno za sve nasljedne widgete, ali u praksi lakše je widgetima upravljati upotrebom predložaka(layouta). Layouti se brinu da svi widgeti budu posloženi unutar svojih granica. &quot;QVboxLayout&amp;quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html primjerice, postavlja sve widgete okomito jedan iznad drugoga.


Red 10 koristi Qt mehanizam za signale i slotove da bi se izvršilo zatvaranje aplikacije klikom miša na tipku za zatvaranje aplikacije. Slot je funkcija koja se izvršava pozivanjem iste koristeći njegzin #####. Signal je funkcija koja će nakon što je pozvana, pokrenuti slotove koji su vezani na nju; povezujemo slot sa signalom.
U redovima 13 i 14 dodajemo tekst i pripadajuće dugme u &quot;QVboxLayout&amp;quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html predložak. U redu 17 postavljamo predložak na glavni widget.


quite() je slot od [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] ''[doc.qt.nokia.com]'' clicked() je signal koji [http://doc.qt.nokia.com/4.7/qpushbutton.html QPushButton] ''[doc.qt.nokia.com]'' šalje dok korisniki klikne na njega. Statička metoda QObject::connect() brine se za povezivanje slota i signala. <span class="caps">SIGNAL</span> i <span class="caps">SLOT</span> su dva makroa koji rješavaju povezivanje funkcija signala i slotova. Također, potrebno je dodati pokazivače na objekte koji primaju i šalju signal.
=== Dodatne informacije<br />|''. Tema |''. Gdje? |<br />| Signali i Slotovi | &quot;Signals &amp; Slots&amp;quot;:http://doc.qt.nokia.com/4.7/signalsandslots.html |<br />| Layouti / Predlošci | &quot;Layout Management&amp;quot;:http://doc.qt.nokia.com/4.7/layout.html, &quot;Widgets and Layouts&amp;quot;:http://doc.qt.nokia.com/4.7/widgets-and-layouts.html, &quot;Layout Examples&amp;quot;:http://doc.qt.nokia.com/4.7/examples-layouts.html |<br />| Widgeti | &quot;Qt Widget Gallery&amp;quot;:http://doc.qt.nokia.com/4.7/gallery.html, &quot;Widget Examples&amp;quot;:http://doc.qt.nokia.com/4.7/examples-widgets.html | ===


U redu 12 kreiramo [http://doc.qt.nokia.com/4.7/qvboxlayout.html QVboxLayout] ''[doc.qt.nokia.com]''. Kao što je prije spomenuto, widgeti mogu u sebi sadržavati druge widgete. Moguće je postaviti granice (položaj i veličinu) direktno za sve nasljedne widgete, ali u praksi lakše je widgetima upravljati upotrebom predložaka(layouta). Layouti se brinu da svi widgeti budu posloženi unutar svojih granica. [http://doc.qt.nokia.com/4.7/qvboxlayout.html QVboxLayout] ''[doc.qt.nokia.com]'' primjerice, postavlja sve widgete okomito jedan iznad drugoga.
== Nasljeđivanje QWidget klase ==


U redovima 13 i 14 dodajemo tekst i pripadajuće dugme u [http://doc.qt.nokia.com/4.7/qvboxlayout.html QVboxLayout] ''[doc.qt.nokia.com]'' predložak. U redu 17 postavljamo predložak na glavni widget.
When the user wants to quit an application, you might want to pop-up a dialog that asks whether he/she really wants to quit. In this example, we subclass &quot;QWidget&amp;quot;:http://doc.qt.nokia.com/4.7/qwidget.html, and add a slot that we connect to the Quit button.


===Dodatne informacije {| class="infotable line" ! Tema ! Gdje? |- | Signali i Slotovi | [http://doc.qt.nokia.com/4.7/signalsandslots.html Signals &amp; Slots] ''[doc.qt.nokia.com]'' |- | Layouti / Predlošci | [http://doc.qt.nokia.com/4.7/layout.html Layout Management] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/widgets-and-layouts.html Widgets and Layouts] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/examples-layouts.html Layout Examples] ''[doc.qt.nokia.com]'' |- | Widgeti | [http://doc.qt.nokia.com/4.7/gallery.html Qt Widget Gallery] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/examples-widgets.html Widget Examples] ''[doc.qt.nokia.com]'' |}===
Kad korisnik poželi napustiti aplikaciju, poželjno je prije zatvaranja aplikacije korisniku prikazatio dijalog s pitanjem da li je siguran da želi zatvoriti aplikaciju. U ovom primjeru, izvest ćemo novu klasu iz postojeće &quot;QWidget&amp;quot;:http://doc.qt.nokia.com/4.7/qwidget.html klase, dodati slot i povezati ga s tipkom za izlazak iz aplikacije.


==Nasljeđivanje QWidget klase==
p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs3.png)|http://doc.qt.nokia.com/4.7/images/gs3.png)]]


When the user wants to quit an application, you might want to pop-up a dialog that asks whether he/she really wants to quit. In this example, we subclass [http://doc.qt.nokia.com/4.7/qwidget.html QWidget] ''[doc.qt.nokia.com]'', and add a slot that we connect to the Quit button.
Pogledajmo izvorni kod aplikacije:<br /><code><br />class Notepad : public QWidget<br />{<br /> Q_OBJECT


Kad korisnik poželi napustiti aplikaciju, poželjno je prije zatvaranja aplikacije korisniku prikazatio dijalog s pitanjem da li je siguran da želi zatvoriti aplikaciju. U ovom primjeru, izvest ćemo novu klasu iz postojeće [http://doc.qt.nokia.com/4.7/qwidget.html QWidget] ''[doc.qt.nokia.com]'' klase, dodati slot i povezati ga s tipkom za izlazak iz aplikacije.
public:<br /> Notepad();


[[Image:gs3.png)]]
private slots:<br /> void quit();


Pogledajmo izvorni kod aplikacije:<br /> Q_OBJECT macro mora postavljen na početak klase i time se naše klasa deklarira kao [http://doc.qt.nokia.com/4.7/qobject.html QObject] ''[doc.qt.nokia.com]'' (Naravno, isto tako mora i naslijeđivati [http://doc.qt.nokia.com/4.7/qobject.html QObject] ''[doc.qt.nokia.com]''). [http://doc.qt.nokia.com/4.7/qobject.html QObject] ''[doc.qt.nokia.com]'' dodaje nekoliko novih mogućnosti postojećoj C++ klasi. Prvenstveno, ##### klase i ###### slotova dostupni su tijekom izvršavanja aplikacije. Isto tako, moguće je saznati sve parametre slotova te ih po potrebi i pozivati.
private:<br /> QTextEdit *textEdit;<br /> QPushButton *quitButton;<br />};<br /></code><br />Q_OBJECT macro mora postavljen na početak klase i time se naše klasa deklarira kao &quot;QObject&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html (Naravno, isto tako mora i naslijeđivati &quot;QObject&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html). &quot;QObject&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html dodaje nekoliko novih mogućnosti postojećoj C++ klasi. Prvenstveno, naziv klase i nazivi slotova dostupni su tijekom izvršavanja aplikacije. Isto tako, moguće je saznati sve parametre slotova te ih po potrebi i pozivati.


U redu 13 radimo deklaraciju slota quit() što se jednostavno radi upotrebom makroa za slotove. Quit() slot sad moze biti povezan sa signalima s kojima dijeli zajednički potpis (bilo koji signal koji u sebi nema pripadajućih parametara).
U redu 13 radimo deklaraciju slota quit() što se jednostavno radi upotrebom makroa za slotove. Quit() slot sad moze biti povezan sa signalima s kojima dijeli zajednički potpis (bilo koji signal koji u sebi nema pripadajućih parametara).
Line 61: Line 76:
Umjesto ručnog postavljanja korisničkog sučelja i povezivanje slotova unutar main() funkcije, upotrijebit cemo konstruktor Notepad()
Umjesto ručnog postavljanja korisničkog sučelja i povezivanje slotova unutar main() funkcije, upotrijebit cemo konstruktor Notepad()


Kao što se moze vidjeti u definiciji klase, koristimo pointere na naše [http://doc.qt.nokia.com/4.7/qobject.html QObject] ''[doc.qt.nokia.com]'' objekte (textEdit i quitButton), Po pravilima, poželjno je alocirati sve QObjects na hrpu i nikad ih ne kopirati.
<code><br />Notepad::Notepad()<br />{<br /> textEdit = new QTextEdit;<br /> quitButton = new QPushButton(tr(&quot;Izađi&amp;quot;));
 
Nadalje, koristimo funkciju &lt;i&gt;tr()&lt;/i&gt; tekstove. Ova je funkcija potrebna ukoliko želimo da naša aplikacija radi na više od jednog jezika (primjerice Hrvatski i Engleski). Ovdje nećemo ići u detalje, ali više informacija možete saznati u dokumentaciji za [http://doc.qt.nokia.com/4.7/linguist-manual.html Qt Linguist] ''[doc.qt.nokia.com]''
 
===Dodatne informacije {| class="infotable line" ! Tema ! Gdje? |- | tr() i internacionalizacija | [http://doc.qt.nokia.com/4.7/linguist-manual.html Qt Linguist Manual] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/i18n-source-translation.html Writing Source Code for Translation] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/linguist-hellotr.html Hello tr()] ''[doc.qt.nokia.com]'' Example, [http://doc.qt.nokia.com/4.7/internationalization.html Internationalization with Qt] ''[doc.qt.nokia.com]'' |- | [http://doc.qt.nokia.com/4.7/qobject.html QObject] ''[doc.qt.nokia.com]'' i Qt Object Model (osnova za rad u Qt-u) | [http://doc.qt.nokia.com/4.7/object.html Object Model] ''[doc.qt.nokia.com]'' |- | qmake i Qt build sustav | [http://doc.qt.nokia.com/4.7/qmake-manual.html qmake Manual] ''[doc.qt.nokia.com]'' |}===
 
==Kreiranje .pro datoteke==
 
Za ovaj primjer, umjesto upotrebe qmake -project naredbe, .pro datoteku ćemo kreirati sami.<br /> Upotrebom sljedećih naredbi dobit ćemo izvršnu datoteku koju možemo pokrenuti.<br />
 
==Upotreba QMainWindow widgeta==
 
Veliki broj aplikacija koristi prednosti [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] ''[doc.qt.nokia.com]'', koji ima svoj vlastiti layout na kojeg možemo dodati traku s alatima, widgete, menije i statusni bar. Središnja površina unutar [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] ''[doc.qt.nokia.com]'' može sadržavati bilo koji widget. U našem slučaju mi ćemo staviti [http://doc.qt.nokia.com/4.7/qtextedit.html QTextEdit] ''[doc.qt.nokia.com]'' widget.
 
[[Image:gs4.png|QMainWindow]]
 
Pogledajmo sada novu definiciju klase Notepad:<br /> U aplikaciju smo dodali i dva nova slota pomoću kojih ćemo snimiti i učitati dokument. Njih ćemo implementirati malo kasnije.
 
Čest je slučaj da unutar glavnog prozora jedan slot aktivira više widgeta. Primjer je upotreba menija i alatne trake. Da bi se to pojednostavilo, Qt omogućuje upotrebu [http://doc.qt.nokia.com/4.7/qaction.html QAction] ''[doc.qt.nokia.com]'' koju možemo proslijediti nekolicini widgeta, te ih spajati na slotove. Primjerice, [[:http://doc.qt.nokia.com/4.7/qmenu.html|QMenu]] i [http://doc.qt.nokia.com/4.7/qtoolbar.html QToolBar] ''[doc.qt.nokia.com]'' mogu kreirati nove opcije na meniju ili alate na alatnoj traci iz proslijeđene [http://doc.qt.nokia.com/4.7/qaction.html QAction] ''[doc.qt.nokia.com]''. Primjer slijedi ubrzo.
 
Kao i prije, za kreiranje korisničkog sučelja koristi ćemo Notepad konstruktor.<br />
 
[http://doc.qt.nokia.com/4.7/qaction.html QActions] ''[doc.qt.nokia.com]'' se kreiraju s tekstom koji će se pojaviti na widgetu kojima ih proslijedimo (u našem primjeru opcije na meniju). Ukoliko želimo iste dodati u [http://doc.qt.nokia.com/4.7/qtoolbar.htm QToolBar] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/qaction.html QAction] ''[doc.qt.nokia.com]'' mora imati pridužen [http://doc.qt.nokia.com/4.7/qicon.html QIcon] ''[doc.qt.nokia.com]'' objekt.
 
Kad kliknemo na opciju unutar menija, pozvat će se pripadajući [http://doc.qt.nokia.com/4.7/qaction.html QAction] ''[doc.qt.nokia.com]'' koji će zatim pozvati pripadajući slot
 
===Dodatne informacije {| class="infotable line" ! Tema ! Gdje? |- | MainWindow i pripadajuće klase | [http://doc.qt.nokia.com/4.7/mainwindow.html Application Main Window] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/examples-mainwindow.html Main Window Examples] ''[doc.qt.nokia.com]'' |- | <span class="caps">MDI</span> aplikacije | [http://doc.qt.nokia.com/4.7/qmdiarea.html QMdiArea] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/mainwindows-mdi.html <span class="caps">MDI</span> Example] ''[doc.qt.nokia.com]'' |}===
 
==Snimanje i učitavanje==
 
U ovom primjeru implementirat ćemo funkcionalnost za open() i save() slotove koje smo dodali u prijašnjem primjeru.
 
[[Image:gs5.png]]
 
Počet ćemo s implelentacijom open() slota:<br />
 
Prvi korak je upitati korisnika ##### datoteke koju ćemo učitati. Qt dolazi s [http://doc.qt.nokia.com/4.7/qfiledialog.html QFileDialog] ''[doc.qt.nokia.com]'', koji omogućuje korisniku odabir datoteke. Slika iznad prikazuje dijalog prikazan na Kubuntu operativnom sustavu. Metoda getOpenFileName() prikazuje dijalog za izbor datoteke i sve dok datoteka ne bude odabrana ili korisnik odustane, on će biti prikazan. Po zatvaranju, vraća se putanja do datoteke ukoliko je ista odbarana, ili prazan string ukoliko je korisnik odustao.


Ukoliko imam ##### datoteke, pokušat ćemo je otvoriti s open() s time da ćemo dobiti &lt;i&gt;true&lt;/i&gt; ukoliko je datoteka uspješno otvorena. U ovom primjeru nećemo ulaziti u pojašnjavanje kako rješiti pojavu grešaka u aplikacija, ali preporučamo slijediti linkove iz Više Informacija dijela ovog teksta. Ukoliko se datoteka iz nekog razloga nemože otvoriti, koristimo [http://doc.qt.nokia.com/4.7/qmessagebox.html QMessageBox] ''[doc.qt.nokia.com]'' da prikažemo dijalog s porukom o grešci (pogledati detalje o [http://doc.qt.nokia.com/4.7/qmessagebox.html QMessageBox] ''[doc.qt.nokia.com]'' klasi za dodatne informacije).
connect(quitButton, SIGNAL (clicked()), this, SLOT (quit()));


Čitanje podataka iz otvorene datoteke je prilično trivijalno upotrebom readAll() funkcije, koja nam vrća sve podatke iz datoteke u formatu [http://doc.qt.nokia.com/4.7/qbytearray.html QByteArray] ''[doc.qt.nokia.com]''. Metoda constData() vraća sve podatke u &lt;i&gt;const char*&lt;/i&gt; formatu za kojeg [http://doc.qt.nokia.com/4.7/qstring.html QString] ''[doc.qt.nokia.com]'' ima konstruktor. Sadržaj datoteke nakon toga možemo prikazati u unutar [http://doc.qt.nokia.com/4.7/qtextedit.html QTextEdit] ''[doc.qt.nokia.com]'' widgeta. Nakon toga metodom close() zatvaramo datoteku i vraćamo pristup datoteci operativnom sustavu.
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 />}<br /></code>
<br />Kao što se moze vidjeti u definiciji klase, koristimo pointere na naše &quot;QObject&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html objekte (textEdit i quitButton), Po pravilima, poželjno je alocirati sve QObjects na hrpu i nikad ih ne kopirati.
<br />Nadalje, koristimo funkciju &lt;i&amp;gt;tr()&lt;/i&amp;gt; tekstove. Ova je funkcija potrebna ukoliko želimo da naša aplikacija radi na više od jednog jezika (primjerice Hrvatski i Engleski). Ovdje nećemo ići u detalje, ali više informacija možete saznati u dokumentaciji za &quot;Qt Linguist&amp;quot;:http://doc.qt.nokia.com/4.7/linguist-manual.html
<br />h3. Dodatne informacije<br />|''. Tema |''. Gdje? |<br />| tr() i internacionalizacija | &quot;Qt Linguist Manual&amp;quot;:http://doc.qt.nokia.com/4.7/linguist-manual.html, &quot;Writing Source Code for Translation&amp;quot;:http://doc.qt.nokia.com/4.7/i18n-source-translation.html, &quot;Hello tr()&quot;:http://doc.qt.nokia.com/4.7/linguist-hellotr.html Example, &quot;Internationalization with Qt&amp;quot;:http://doc.qt.nokia.com/4.7/internationalization.html |<br />| &quot;QObject&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html i Qt Object Model (osnova za rad u Qt-u) | &quot;Object Model&amp;quot;:http://doc.qt.nokia.com/4.7/object.html |<br />| qmake i Qt build sustav | &quot;qmake Manual&amp;quot;:http://doc.qt.nokia.com/4.7/qmake-manual.html |


Idemo pogledati source kod za save() metodu:<br />
<br />h2. Kreiranje .pro datoteke
<br />Za ovaj primjer, umjesto upotrebe qmake <s>project naredbe, .pro datoteku ćemo kreirati sami.<br /><code><br />HEADERS = notepad.h<br />SOURCES = notepad.cpp main.cpp<br /></code><br />Upotrebom sljedećih naredbi dobit ćemo izvršnu datoteku koju možemo pokrenuti.<br /><code><br />qmake<br />make<br /></code>
<br />h2. Upotreba QMainWindow widgeta
<br /> Veliki broj aplikacija koristi prednosti &quot;QMainWindow&amp;quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html, koji ima svoj vlastiti layout na kojeg možemo dodati traku s alatima, widgete, menije i statusni bar. Središnja površina unutar &quot;QMainWindow&amp;quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html može sadržavati bilo koji widget. U našem slučaju mi ćemo staviti &quot;QTextEdit&amp;quot;:http://doc.qt.nokia.com/4.7/qtextedit.html widget.
<br />p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs4.png|QMainWindow]]
<br />Pogledajmo sada novu definiciju klase Notepad:<br /><code><br />#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 />};<br /></code><br />U aplikaciju smo dodali i dva nova slota pomoću kojih ćemo snimiti i učitati dokument. Njih ćemo implementirati malo kasnije.
<br />Čest je slučaj da unutar glavnog prozora jedan slot aktivira više widgeta. Primjer je upotreba menija i alatne trake. Da bi se to pojednostavilo, Qt omogućuje upotrebu &quot;QAction&amp;quot;:http://doc.qt.nokia.com/4.7/qaction.html koju možemo proslijediti nekolicini widgeta, te ih spajati na slotove. Primjerice, &quot;QMenu&amp;quot;::http://doc.qt.nokia.com/4.7/qmenu.html i &quot;QToolBar&amp;quot;:http://doc.qt.nokia.com/4.7/qtoolbar.html mogu kreirati nove opcije na meniju ili alate na alatnoj traci iz proslijeđene &quot;QAction&amp;quot;:http://doc.qt.nokia.com/4.7/qaction.html. Primjer slijedi ubrzo.
<br />Kao i prije, za kreiranje korisničkog sučelja koristi ćemo Notepad konstruktor.<br /><code><br />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 />}<br /></code>
<br />&quot;QActions&amp;quot;:http://doc.qt.nokia.com/4.7/qaction.html se kreiraju s tekstom koji će se pojaviti na widgetu kojima ih proslijedimo (u našem primjeru opcije na meniju). Ukoliko želimo iste dodati u &quot;QToolBar&amp;quot;:http://doc.qt.nokia.com/4.7/qtoolbar.htm, &quot;QAction&amp;quot;:http://doc.qt.nokia.com/4.7/qaction.html mora imati pridužen &quot;QIcon&amp;quot;:http://doc.qt.nokia.com/4.7/qicon.html objekt.
<br />Kad kliknemo na opciju unutar menija, pozvat će se pripadajući &quot;QAction&amp;quot;:http://doc.qt.nokia.com/4.7/qaction.html koji će zatim pozvati pripadajući slot
<br />h3. Dodatne informacije<br />|''. Tema |''. Gdje? |<br />| MainWindow i pripadajuće klase | &quot;Application Main Window&amp;quot;:http://doc.qt.nokia.com/4.7/mainwindow.html, &quot;Main Window Examples&amp;quot;:http://doc.qt.nokia.com/4.7/examples-mainwindow.html |<br />| MDI aplikacije | &quot;QMdiArea&amp;quot;:http://doc.qt.nokia.com/4.7/qmdiarea.html, &quot;MDI Example&amp;quot;:http://doc.qt.nokia.com/4.7/mainwindows-mdi.html |
<br />h2. Snimanje i učitavanje
<br />U ovom primjeru implementirat ćemo funkcionalnost za open() i save() slotove koje smo dodali u prijašnjem primjeru.
<br />p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs5.png|http://doc.qt.nokia.com/4.7/images/gs5.png]]
<br />Počet ćemo s implelentacijom open() slota:<br /><code><br />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</s>&gt;setPlainText(contents);<br /> file.close();<br />}<br /></code>
<br />Prvi korak je upitati korisnika naziv datoteke koju ćemo učitati. Qt dolazi s &quot;QFileDialog&amp;quot;:http://doc.qt.nokia.com/4.7/qfiledialog.html, koji omogućuje korisniku odabir datoteke. Slika iznad prikazuje dijalog prikazan na Kubuntu operativnom sustavu. Metoda getOpenFileName() prikazuje dijalog za izbor datoteke i sve dok datoteka ne bude odabrana ili korisnik odustane, on će biti prikazan. Po zatvaranju, vraća se putanja do datoteke ukoliko je ista odbarana, ili prazan string ukoliko je korisnik odustao.
<br />Ukoliko imam naziv datoteke, pokušat ćemo je otvoriti s open() s time da ćemo dobiti &lt;i&amp;gt;true&amp;lt;/i&amp;gt; ukoliko je datoteka uspješno otvorena. U ovom primjeru nećemo ulaziti u pojašnjavanje kako rješiti pojavu grešaka u aplikacija, ali preporučamo slijediti linkove iz Više Informacija dijela ovog teksta. Ukoliko se datoteka iz nekog razloga nemože otvoriti, koristimo &quot;QMessageBox&amp;quot;:http://doc.qt.nokia.com/4.7/qmessagebox.html da prikažemo dijalog s porukom o grešci (pogledati detalje o &quot;QMessageBox&amp;quot;:http://doc.qt.nokia.com/4.7/qmessagebox.html klasi za dodatne informacije).
<br />Čitanje podataka iz otvorene datoteke je prilično trivijalno upotrebom readAll() funkcije, koja nam vrća sve podatke iz datoteke u formatu &quot;QByteArray&amp;quot;:http://doc.qt.nokia.com/4.7/qbytearray.html. Metoda constData() vraća sve podatke u &lt;i&amp;gt;const char'''&lt;/i&amp;gt; formatu za kojeg &quot;QString&amp;quot;:http://doc.qt.nokia.com/4.7/qstring.html ima konstruktor. Sadržaj datoteke nakon toga možemo prikazati u unutar &quot;QTextEdit&amp;quot;:http://doc.qt.nokia.com/4.7/qtextedit.html widgeta. Nakon toga metodom close() zatvaramo datoteku i vraćamo pristup datoteci operativnom sustavu.


Kad zapisujemo sadržaj tekst kontrole u datoteku, koristimo [http://doc.qt.nokia.com/4.7/qtextstream.html QTextStream] ''[doc.qt.nokia.com]'' klasu, kao wrapper [http://doc.qt.nokia.com/4.7/qfile.html QFile] ''[doc.qt.nokia.com]'' objekta. Tekstualni stream zapisuje [http://doc.qt.nokia.com/4.7/qstring.html QString] ''[doc.qt.nokia.com]'' direkto u datoteku; [http://doc.qt.nokia.com/4.7/qfile.html QFile] ''[doc.qt.nokia.com]'' prima jedino podatke u &lt;i&gt;char*&lt;/i&gt; formatu i s write() metodom [http://doc.qt.nokia.com/4.7/qiodevice.html <span class="caps">QIOD</span>evice] ''[doc.qt.nokia.com]'' klase;
Idemo pogledati source kod za save() metodu:<br /><code><br />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 />}<br /></code>
<br />Kad zapisujemo sadržaj tekst kontrole u datoteku, koristimo &quot;QTextStream&amp;quot;:http://doc.qt.nokia.com/4.7/qtextstream.html klasu, kao wrapper &quot;QFile&amp;quot;:http://doc.qt.nokia.com/4.7/qfile.html objekta. Tekstualni stream zapisuje &quot;QString&amp;quot;:http://doc.qt.nokia.com/4.7/qstring.html direkto u datoteku; &quot;QFile&amp;quot;:http://doc.qt.nokia.com/4.7/qfile.html prima jedino podatke u &lt;i&amp;gt;char'''&lt;/i&amp;gt; formatu i s write() metodom &quot;QIODevice&amp;quot;:http://doc.qt.nokia.com/4.7/qiodevice.html klase;


===Dodatne informacije {| class="infotable line" ! Tema ! Gdje? |- | Datoteke i I/O uređaji | [http://doc.qt.nokia.com/4.7/qfile.html QFile] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/qiodevice.html <span class="caps">QIOD</span>evice] ''[doc.qt.nokia.com]'' |}===
=== Dodatne informacije<br />|''. Tema |''. Gdje? | ===

Revision as of 06:32, 24 February 2015

Pregledajte ovu stranicu na sljedećim jezicima: "en&quot;:http://doc.qt.nokia.com/4.7/gettingstartedqt.html, "es&quot;:http://developer.qt.nokia.com/wiki/GettingStartedQt_Spanish, "ru&quot;:http://developer.qt.nokia.com/wiki/GettingStartedWithQtRussian, "pl&quot;:http://developer.qt.nokia.com/wiki/GettingStartedQtPolish, "pt&quot;:http://developer.qt.nokia.com/wiki/gettingStartedPortuguese, "nl&quot;:http://developer.qt.nokia.com/wiki/GettingStartedQtDutch

[toc align_right="yes&quot; depth="2&quot;]

Početak programiranja u Qt

Dobrodošli u svijet Qt-a— više platformskog GUI frameworka. U ovom vodiču proći ćemo osnove Qt izradom jednostavne Notepad aplikacije.

Pozdrav Notepad

U prvom primjeru pokazat ćemo kako kreirati i prikazati editor teksta unutar prozora na desktopu. To je najednostavnija upotreba Qt-a u radu s korisničkim sučeljem.

p=. Texteingabefenster

Izvorni kod aplikacije:

<br />#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 />}<br />


Idemo proci kroz izvorni kod aplikacije red po red. U prve dvije linije koda, dodajemo header datoteke za "QApplication&quot;:http://doc.qt.nokia.com/4.7/qapplication.html i "QTextEdit&quot;:http://doc.qt.nokia.com/4.7/qtextedit.html, dvije klase koje su nam potrebne za ovaj primjer. Sve Qt klase imaju header datoteku s nazivom klase.


U redu 6. aplikacije kreiramo "QApplication&quot;:http://doc.qt.nokia.com/4.7/qapplication.html objekt. Ovaj objekt upravlja svim resursima na razini cijele aplikacije i neophodan je za sve Qt programe koji uključuju korisničko sučelje. Parametri argv i args su mu potrebni s obziorm da Qt prihvaća nekoliko komandnolinijskih parametara.
Red 8 kreira "QTextEdit&quot;:http://doc.qt.nokia.com/4.7/qtextedit.html objekt. Text Edit je vizualni element u koriničkom sučelju. U Qt, takve objekte nazivamo widgetima. Orimjeri drugih widgeta su scroll barovi, dugmad i tekst elementi. Widget je istovremeno može sadrćavati i druge widgete; dialog ili glavni prozor aplikacije.
Red 9 prikazuje Text Edit na ekranu unutar prozora aplikacije. S obzirom da widgeti istovremeno mogu u sebi sadržavati druge widgete (instanca "QMainWindow&quot;:http://doc.qt.nokia.com/4.7/qmainwindow.htm u sebi sadrži traku s alatima, menije, statusnu traku kao i druge widgete), moguće je prikazati svaki widget unutar njegovog vlastitog prozora. Widgeti pri samom kreiranju nisu vidljivi već ih se mora prikazati upotrebnom funkcije .show().
U redu 11 "QApplication&quot;:http://doc.qt.nokia.com/4.7/qapplication.html ulazi u glavnu petlju u kojoj lovi događaje(eventove). Za vrijeme izvršavanja Qt aplikacije, eventovi se kreiraju i šalju widgetima unutar aplikacije. Primjeri događaja su pritisak na tipku miša ili unos na tipkovnici. Dok upisujete tekst u TextEdit widget, on prima event koji mu govori da je pritisnuta tipka i koja tipka je pritisnuta i zatim u skladu s time iscratava se upisani tekst.


Da bi pokrenuli aplikaciju, otvorite komadnu liniju, pronađite direktorij u kojem se nalazi .cpp datoteka programa. —Upišite sljedeće linije da bi pokrenuli program:

<br /> qmake -project<br /> qmake<br /> make<br />


Pokretanje ove skripte kreirat će izvrnu datoteku u part1 direkoriju (korinici Windows opertativnog sustava, umjeto <i&gt;make&lt;/i&gt; komande koristite <i&gt;nmake&lt;/i&gt;. Isto tako, izvrsna datoteka će biti locirana u direktorijima part1/debug i part1/release). QMake je Qt alat za izradu izvršnih datoteka iz konfiguracijskih datoteka. Njih takodjer kreira qmake upotrebom -project paramtera. Iz konfiguracijske datoteke (sa sufiksom .pro), qmake kreira </&gt;make&lt;/i&gt; datoteku iz koje će se generirati izvrćna datoteka aplikacije. O pisanju vlastitih .pro datoteka ćemo malo kasnije.
h3. Dodatne informacije
|. Tema |. Gdje? |
| Widgeti i upotreba Window widgeta | "Window and Dialog Widgets&quot;:http://doc.qt.nokia.com/4.7/application-windows.html |
| Eventi i rad s njima | "The Event System&quot;:http://doc.qt.nokia.com/4.7/eventsandfilters.html |
h2. Dodavanje tipke za izlak iz programa
Za izradu pravih aplikacija bit će nam potrebno više od jednog widgeta. Zato ćemo sada dodati "QPushButton&quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html ispod Text Edit elementa. Pritiskom na novo dodanu tipku aplikacija će se zatvoriti.
p=. http://doc.qt.nokia.com/4.7/images/gs2.png
Pogledajmo izvorni kod aplikacije.


<br />#include &lt;QtGui&amp;gt;
<br />int main(int argv, char'''*args)<br />{<br /> QApplication app(argv, args);

QTextEdit textEdit;<br /> QPushButton quitButton(&quot;Izađi&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 />}<br />

U prvom redu dodajemo QtGui header datoteku koja sadrži sve klase potrebne za Qt korisničko sučelje.

Red 10 koristi Qt mehanizam za signale i slotove da bi se izvršilo zatvaranje aplikacije klikom miša na tipku za zatvaranje aplikacije. Slot je funkcija koja se izvršava pozivanjem iste koristeći njegzin naziv. Signal je funkcija koja će nakon što je pozvana, pokrenuti slotove koji su vezani na nju; povezujemo slot sa signalom.

quite() je slot od "QApplication&quot;:http://doc.qt.nokia.com/4.7/qapplication.html clicked() je signal koji "QPushButton&quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html šalje dok korisniki klikne na njega. Statička metoda QObject::connect() brine se za povezivanje slota i signala. SIGNAL () i SLOT() su dva makroa koji rješavaju povezivanje funkcija signala i slotova. Također, potrebno je dodati pokazivače na objekte koji primaju i šalju signal.

U redu 12 kreiramo "QVboxLayout&quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html. Kao što je prije spomenuto, widgeti mogu u sebi sadržavati druge widgete. Moguće je postaviti granice (položaj i veličinu) direktno za sve nasljedne widgete, ali u praksi lakše je widgetima upravljati upotrebom predložaka(layouta). Layouti se brinu da svi widgeti budu posloženi unutar svojih granica. "QVboxLayout&quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html primjerice, postavlja sve widgete okomito jedan iznad drugoga.

U redovima 13 i 14 dodajemo tekst i pripadajuće dugme u "QVboxLayout&quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html predložak. U redu 17 postavljamo predložak na glavni widget.

Dodatne informacije
|. Tema |. Gdje? |
| Signali i Slotovi | "Signals & Slots&quot;:http://doc.qt.nokia.com/4.7/signalsandslots.html |
| Layouti / Predlošci | "Layout Management&quot;:http://doc.qt.nokia.com/4.7/layout.html, "Widgets and Layouts&quot;:http://doc.qt.nokia.com/4.7/widgets-and-layouts.html, "Layout Examples&quot;:http://doc.qt.nokia.com/4.7/examples-layouts.html |
| Widgeti | "Qt Widget Gallery&quot;:http://doc.qt.nokia.com/4.7/gallery.html, "Widget Examples&quot;:http://doc.qt.nokia.com/4.7/examples-widgets.html |

Nasljeđivanje QWidget klase

When the user wants to quit an application, you might want to pop-up a dialog that asks whether he/she really wants to quit. In this example, we subclass "QWidget&quot;:http://doc.qt.nokia.com/4.7/qwidget.html, and add a slot that we connect to the Quit button.

Kad korisnik poželi napustiti aplikaciju, poželjno je prije zatvaranja aplikacije korisniku prikazatio dijalog s pitanjem da li je siguran da želi zatvoriti aplikaciju. U ovom primjeru, izvest ćemo novu klasu iz postojeće "QWidget&quot;:http://doc.qt.nokia.com/4.7/qwidget.html klase, dodati slot i povezati ga s tipkom za izlazak iz aplikacije.

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

Pogledajmo izvorni kod aplikacije:

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

public:<br /> Notepad();

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

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


Q_OBJECT macro mora postavljen na početak klase i time se naše klasa deklarira kao "QObject&quot;:http://doc.qt.nokia.com/4.7/qobject.html (Naravno, isto tako mora i naslijeđivati "QObject&quot;:http://doc.qt.nokia.com/4.7/qobject.html). "QObject&quot;:http://doc.qt.nokia.com/4.7/qobject.html dodaje nekoliko novih mogućnosti postojećoj C++ klasi. Prvenstveno, naziv klase i nazivi slotova dostupni su tijekom izvršavanja aplikacije. Isto tako, moguće je saznati sve parametre slotova te ih po potrebi i pozivati.

U redu 13 radimo deklaraciju slota quit() što se jednostavno radi upotrebom makroa za slotove. Quit() slot sad moze biti povezan sa signalima s kojima dijeli zajednički potpis (bilo koji signal koji u sebi nema pripadajućih parametara).

Umjesto ručnog postavljanja korisničkog sučelja i povezivanje slotova unutar main() funkcije, upotrijebit cemo konstruktor Notepad()

<br />Notepad::Notepad()<br />{<br /> textEdit = new QTextEdit;<br /> quitButton = new QPushButton(tr(&quot;Izađi&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 />}<br />


Kao što se moze vidjeti u definiciji klase, koristimo pointere na naše "QObject&quot;:http://doc.qt.nokia.com/4.7/qobject.html objekte (textEdit i quitButton), Po pravilima, poželjno je alocirati sve QObjects na hrpu i nikad ih ne kopirati.
Nadalje, koristimo funkciju <i&gt;tr()</i&gt; tekstove. Ova je funkcija potrebna ukoliko želimo da naša aplikacija radi na više od jednog jezika (primjerice Hrvatski i Engleski). Ovdje nećemo ići u detalje, ali više informacija možete saznati u dokumentaciji za "Qt Linguist&quot;:http://doc.qt.nokia.com/4.7/linguist-manual.html
h3. Dodatne informacije
|. Tema |. Gdje? |
| tr() i internacionalizacija | "Qt Linguist Manual&quot;:http://doc.qt.nokia.com/4.7/linguist-manual.html, "Writing Source Code for Translation&quot;:http://doc.qt.nokia.com/4.7/i18n-source-translation.html, "Hello tr()":http://doc.qt.nokia.com/4.7/linguist-hellotr.html Example, "Internationalization with Qt&quot;:http://doc.qt.nokia.com/4.7/internationalization.html |
| "QObject&quot;:http://doc.qt.nokia.com/4.7/qobject.html i Qt Object Model (osnova za rad u Qt-u) | "Object Model&quot;:http://doc.qt.nokia.com/4.7/object.html |
| qmake i Qt build sustav | "qmake Manual&quot;:http://doc.qt.nokia.com/4.7/qmake-manual.html |


h2. Kreiranje .pro datoteke


Za ovaj primjer, umjesto upotrebe qmake project naredbe, .pro datoteku ćemo kreirati sami.

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


Upotrebom sljedećih naredbi dobit ćemo izvršnu datoteku koju možemo pokrenuti.

<br />qmake<br />make<br />


h2. Upotreba QMainWindow widgeta
Veliki broj aplikacija koristi prednosti "QMainWindow&quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html, koji ima svoj vlastiti layout na kojeg možemo dodati traku s alatima, widgete, menije i statusni bar. Središnja površina unutar "QMainWindow&quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html može sadržavati bilo koji widget. U našem slučaju mi ćemo staviti "QTextEdit&quot;:http://doc.qt.nokia.com/4.7/qtextedit.html widget.
p=. QMainWindow


Pogledajmo sada novu definiciju klase Notepad:

<br />#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 />};<br />


U aplikaciju smo dodali i dva nova slota pomoću kojih ćemo snimiti i učitati dokument. Njih ćemo implementirati malo kasnije.


Čest je slučaj da unutar glavnog prozora jedan slot aktivira više widgeta. Primjer je upotreba menija i alatne trake. Da bi se to pojednostavilo, Qt omogućuje upotrebu "QAction&quot;:http://doc.qt.nokia.com/4.7/qaction.html koju možemo proslijediti nekolicini widgeta, te ih spajati na slotove. Primjerice, "QMenu&quot;::http://doc.qt.nokia.com/4.7/qmenu.html i "QToolBar&quot;:http://doc.qt.nokia.com/4.7/qtoolbar.html mogu kreirati nove opcije na meniju ili alate na alatnoj traci iz proslijeđene "QAction&quot;:http://doc.qt.nokia.com/4.7/qaction.html. Primjer slijedi ubrzo.


Kao i prije, za kreiranje korisničkog sučelja koristi ćemo Notepad konstruktor.

<br />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 />}<br />


"QActions&quot;:http://doc.qt.nokia.com/4.7/qaction.html se kreiraju s tekstom koji će se pojaviti na widgetu kojima ih proslijedimo (u našem primjeru opcije na meniju). Ukoliko želimo iste dodati u "QToolBar&quot;:http://doc.qt.nokia.com/4.7/qtoolbar.htm, "QAction&quot;:http://doc.qt.nokia.com/4.7/qaction.html mora imati pridužen "QIcon&quot;:http://doc.qt.nokia.com/4.7/qicon.html objekt.
Kad kliknemo na opciju unutar menija, pozvat će se pripadajući "QAction&quot;:http://doc.qt.nokia.com/4.7/qaction.html koji će zatim pozvati pripadajući slot
h3. Dodatne informacije
|. Tema |. Gdje? |
| MainWindow i pripadajuće klase | "Application Main Window&quot;:http://doc.qt.nokia.com/4.7/mainwindow.html, "Main Window Examples&quot;:http://doc.qt.nokia.com/4.7/examples-mainwindow.html |
| MDI aplikacije | "QMdiArea&quot;:http://doc.qt.nokia.com/4.7/qmdiarea.html, "MDI Example&quot;:http://doc.qt.nokia.com/4.7/mainwindows-mdi.html |
h2. Snimanje i učitavanje
U ovom primjeru implementirat ćemo funkcionalnost za open() i save() slotove koje smo dodali u prijašnjem primjeru.
p=. http://doc.qt.nokia.com/4.7/images/gs5.png


Počet ćemo s implelentacijom open() slota:

<br />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</s>&gt;setPlainText(contents);<br /> file.close();<br />}<br />


Prvi korak je upitati korisnika naziv datoteke koju ćemo učitati. Qt dolazi s "QFileDialog&quot;:http://doc.qt.nokia.com/4.7/qfiledialog.html, koji omogućuje korisniku odabir datoteke. Slika iznad prikazuje dijalog prikazan na Kubuntu operativnom sustavu. Metoda getOpenFileName() prikazuje dijalog za izbor datoteke i sve dok datoteka ne bude odabrana ili korisnik odustane, on će biti prikazan. Po zatvaranju, vraća se putanja do datoteke ukoliko je ista odbarana, ili prazan string ukoliko je korisnik odustao.
Ukoliko imam naziv datoteke, pokušat ćemo je otvoriti s open() s time da ćemo dobiti <i&gt;true&lt;/i&gt; ukoliko je datoteka uspješno otvorena. U ovom primjeru nećemo ulaziti u pojašnjavanje kako rješiti pojavu grešaka u aplikacija, ali preporučamo slijediti linkove iz Više Informacija dijela ovog teksta. Ukoliko se datoteka iz nekog razloga nemože otvoriti, koristimo "QMessageBox&quot;:http://doc.qt.nokia.com/4.7/qmessagebox.html da prikažemo dijalog s porukom o grešci (pogledati detalje o "QMessageBox&quot;:http://doc.qt.nokia.com/4.7/qmessagebox.html klasi za dodatne informacije).
Čitanje podataka iz otvorene datoteke je prilično trivijalno upotrebom readAll() funkcije, koja nam vrća sve podatke iz datoteke u formatu "QByteArray&quot;:http://doc.qt.nokia.com/4.7/qbytearray.html. Metoda constData() vraća sve podatke u <i&gt;const char</i&gt; formatu za kojeg "QString&quot;:http://doc.qt.nokia.com/4.7/qstring.html ima konstruktor. Sadržaj datoteke nakon toga možemo prikazati u unutar "QTextEdit&quot;:http://doc.qt.nokia.com/4.7/qtextedit.html widgeta. Nakon toga metodom close() zatvaramo datoteku i vraćamo pristup datoteci operativnom sustavu.

Idemo pogledati source kod za save() metodu:

<br />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 />}<br />


Kad zapisujemo sadržaj tekst kontrole u datoteku, koristimo "QTextStream&quot;:http://doc.qt.nokia.com/4.7/qtextstream.html klasu, kao wrapper "QFile&quot;:http://doc.qt.nokia.com/4.7/qfile.html objekta. Tekstualni stream zapisuje "QString&quot;:http://doc.qt.nokia.com/4.7/qstring.html direkto u datoteku; "QFile&quot;:http://doc.qt.nokia.com/4.7/qfile.html prima jedino podatke u <i&gt;char</i&gt; formatu i s write() metodom "QIODevice&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html klase;

Dodatne informacije
|. Tema |. Gdje? |