Getting Started Programming with QML/hr: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
No edit summary
Line 1: Line 1:
=Početak programiranja u <span class="caps">QML</span>-u=
[toc align_right=&quot;yes&amp;quot; depth=&quot;2&amp;quot;]


Dobrodošli u svijet <span class="caps">QML</span>a, opisnog UI jezika. U ovom vodiču kreirat ćemo jednostavni editor teksta upotrebom <span class="caps">QML</span>a. Nakon što završite s čitanjem ovog vodiča, trebali biste biti spremni za razvoj vlastitih aplikacija upotrebom <span class="caps">QML</span>a i C++.
= Početak programiranja u QML-u =


==<span class="caps">QML</span> u izradi korisničkog sučelja==
Dobrodošli u svijet QMLa, opisnog UI jezika. U ovom vodiču kreirat ćemo jednostavni editor teksta upotrebom QMLa. Nakon što završite s čitanjem ovog vodiča, trebali biste biti spremni za razvoj vlastitih aplikacija upotrebom QMLa i C+''.
<br />h2. QML u izradi korisničkog sučelja
<br />Aplikacija koju ćemo raditi je jednostavni tekstualni editor koji učitava, snima te izvodi jednostavne funkcije na tekstu. Ovaj vodič sastoji se od dva dijela. U prvom dijelu obrađuju se dizajn i izgled aplikacije te ponašanje iste upotrebom opsinog jezika u QMLu. U drugom dijelu, učitavanje i snimanje datoteke bit će implementirano koriteći Qt C. Upotrebom &quot;Qt Meta-Object System&amp;quot;:http://doc.qt.nokia.com/4.7/metaobjects.html omogućujemo QML-ovim elementima pristup C''+ metodama. Radeći u Qt C++ i QML-u, lako je odvojiti logiku korisničkog sučelja od ostatka aplikacije.


Aplikacija koju ćemo raditi je jednostavni tekstualni editor koji učitava, snima te izvodi jednostavne funkcije na tekstu. Ovaj vodič sastoji se od dva dijela. U prvom dijelu obrađuju se dizajn i izgled aplikacije te ponašanje iste upotrebom opsinog jezika u <span class="caps">QML</span>u. U drugom dijelu, učitavanje i snimanje datoteke bit će implementirano koriteći Qt C++. Upotrebom [http://doc.qt.nokia.com/4.7/metaobjects.html Qt Meta-Object System] ''[doc.qt.nokia.com]'' omogućujemo <span class="caps">QML</span>-ovim elementima pristup C++ metodama. Radeći u Qt C++ i <span class="caps">QML</span>-u, lako je odvojiti logiku korisničkog sučelja od ostatka aplikacije.
p=. [[Image:http://doc.qt.nokia.com/4.7/images/qml-texteditor5_editmenu.png|Texteditor]]


[[Image:qml-texteditor5_editmenu.png|Texteditor]]
Da bi pokrenuli QML primjer proslijediti QML datoteku &quot;qmlviewer&amp;quot;:http://doc.qt.nokia.com/4.7/qmlviewer.html programu. C++ dijelovi ovog vodiča predpostavljaju da čitatelj posjeduje osnovno znanje o kreiranju izvršnih datoteka iz Qt projekata.


Da bi pokrenuli <span class="caps">QML</span> primjer proslijediti <span class="caps">QML</span> datoteku [http://doc.qt.nokia.com/4.7/qmlviewer.html qmlviewer] ''[doc.qt.nokia.com]'' programu. C++ dijelovi ovog vodiča predpostavljaju da čitatelj posjeduje osnovno znanje o kreiranju izvršnih datoteka iz Qt projekata.
== Definicija Dugmadi i Menija ==


==Definicija Dugmadi i Menija==
=== Osnovni elementi - dugme ===


===Osnovni elementi – dugme===
Započet ćemo rad na tekst editoru kreiranjem dugmeta. Funkcionalno, dugme se sastoji od područja osjetljivog na akcije miša i naslov. Dugmad izvršava akcije nakon što korisnik klikne na njega.
 
U QML-u, osnovni vizualni element je &quot;Rectangle&amp;quot;:http://doc.qt.nokia.com/4.7/qml-rectangle.html. &quot;Rectangle&amp;quot;:http://doc.qt.nokia.com/4.7/qml-rectangle.html ima svojstva kojima se određuje njegov izgled i položaj.
 
<code><br />import Qt 4.7<br />Rectangle{<br /> id:simplebutton<br /> color: &quot;grey&amp;quot;<br /> width: 150<br /> height: 80<br /> Text{<br /> id: buttonLabel<br /> text: &quot;button label&amp;quot;<br /> anchors.centerIn: parent;<br /> anchors.verticalCenterOffset: –1<br /> }<br />}<br /></code>
 
Prvo, linija koda &lt;code&amp;gt;import Qt 4.7&amp;lt;/code&amp;gt; omogućuje &quot;qmlviewer&amp;quot;:http://doc.qt.nokia.com/4.7/qmlviewer.html alatom da uveze QML element koje ćemo kasnije koristiti. Ova linija je neophodna za svaku QML datoteku. Primjetite da koristimo i verziju Qt-a pri tome.
 
Ovaj jednostavi element ima unikatni naziv, &lt;code&amp;gt;simplebutton&amp;lt;/code&amp;gt; koji je vezan za svojstvo &lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Svojstva elementa &quot;Rectangle&amp;quot;:http://doc.qt.nokia.com/4.7/qml-rectangle.html vežu se za vrijednosti, navođenjem svojstva iza kojeg bi uslijedila dvotočka a zatim vrijednost. U primjeru izvornog koda, siva boje postavljenja je za vrijednost boje(&lt;code&amp;gt;color&amp;lt;/code&amp;gt;) &quot;Rectangle&amp;quot;:http://doc.qt.nokia.com/4.7/qml-rectangle.html elementa. Na isti način postavljena su svojstva za visinu(&lt;code&amp;gt;height&amp;lt;/code&amp;gt;) i širinu(&lt;code&amp;gt;width&amp;lt;/code&amp;gt;) elementa.
 
&quot;Text&amp;quot;:http://doc.qt.nokia.com/4.7/qml-text.html element je nepromjenjivo tekstualno polje. U primjeru ćemo ga nazvati &lt;code&amp;gt;buttonLabel&amp;lt;/code&amp;gt;. Da bi postavili sadržaj &quot;Text&amp;quot;:http://doc.qt.nokia.com/4.7/qml-text.html polja, potrebno je postaviti svojstvo &lt;code&amp;gt;text&amp;lt;/code&amp;gt;. Naziv se nalazi unutar elementa &quot;Rectangle&amp;quot;:http://doc.qt.nokia.com/4.7/qml-rectangle.html i da bi centrirali potrebno je povezati lokaciju &quot;Text&amp;quot;:http://doc.qt.nokia.com/4.7/qml-text.html elementa s njegovim parent elementom, koji je u ovom slucaju &lt;i&amp;gt;simplebutton&amp;lt;/i&amp;gt;.
 
Ovaj ćemo izvorni kod snimiti u datoteku SimpleButton.qml. Pokrenut ćemo &quot;qmlviewer&amp;quot;:http://doc.qt.nokia.com/4.7/qmlviewer.html program s parametrom &lt;code&amp;gt;SimpleButton.qml&amp;lt;/code&amp;gt; i prikazat će nam se sivi pravokutnik s upisanim tekstom.
 
p=. [[Image:http://doc.qt.nokia.com/4.7/images/qml-texteditor1_simplebutton.png|http://doc.qt.nokia.com/4.7/images/qml-texteditor1_simplebutton.png]]
 
Da bismo implementirali interakciju s dugmetom, upotrijebiti ćemo QML-ov sistem za obradu događaja. Obrada događaja u QML-u je prilično slično sustavu signala i slotova u QT-u. Signali se emitiraju i pozivaju povezani slot.


Započet ćemo rad na tekst editoru kreiranjem dugmeta. Funkcionalno, dugme se sastoji od područja osjetljivog na akcije miša i naslov. Dugmad izvršava akcije nakon što korisnik klikne na njega.
<code><br />Rectangle{<br /> id:simplebutton<br /> …


U <span class="caps">QML</span>-u, osnovni vizualni element je [http://doc.qt.nokia.com/4.7/qml-rectangle.html Rectangle] ''[doc.qt.nokia.com]''. [http://doc.qt.nokia.com/4.7/qml-rectangle.html Rectangle] ''[doc.qt.nokia.com]'' ima svojstva kojima se određuje njegov izgled i položaj.
MouseArea{<br /> id: buttonMouseArea


Prvo, linija koda <code>import Qt 4.7</code> omogućuje [http://doc.qt.nokia.com/4.7/qmlviewer.html qmlviewer] ''[doc.qt.nokia.com]'' alatom da uveze <span class="caps">QML</span> element koje ćemo kasnije koristiti. Ova linija je neophodna za svaku <span class="caps">QML</span> datoteku. Primjetite da koristimo i verziju Qt-a pri tome.
anchors.fill: parent //anchor all sides of the mouse area to the rectangle's anchors<br /> //onClicked handles valid mouse button clicks<br /> onClicked: console.log(buttonLabel.text + &quot; clicked&amp;quot; )<br /> }<br />}<br /></code>


Ovaj jednostavi element ima unikatni #####, <code>simplebutton</code> koji je vezan za svojstvo <code>id</code>. Svojstva elementa [http://doc.qt.nokia.com/4.7/qml-rectangle.html Rectangle] ''[doc.qt.nokia.com]'' vežu se za vrijednosti, navođenjem svojstva iza kojeg bi uslijedila dvotočka a zatim vrijednost. U primjeru izvornog koda, siva boje postavljenja je za vrijednost boje(<code>color</code>) [http://doc.qt.nokia.com/4.7/qml-rectangle.html Rectangle] ''[doc.qt.nokia.com]'' elementa. Na isti način postavljena su svojstva za visinu(<code>height</code>) i širinu(<code>width</code>) elementa.
Dodajemo &quot;MouseArea&amp;quot;:http://doc.qt.nokia.com/4.7/qml-mousearea.html našem &lt;code&amp;gt;simplebutton&amp;lt;/code&amp;gt; elementu. &quot;MouseArea&amp;quot;:http://doc.qt.nokia.com/4.7/qml-mousearea.html element opisuje interaktivno područje unutar kojeg se detektiraju korinički pomaci miša. Za naše dugme, povezali smo cijeli &quot;MouseArea&amp;quot;:http://doc.qt.nokia.com/4.7/qml-mousearea.html za područje dugmeta. Dio koda &lt;code&amp;gt;anchors.fill&amp;lt;/code&amp;gt; omogućuje pritup svojstvu &lt;code&amp;gt;fill&amp;lt;/code&amp;gt; unutar grupe svojstva &lt;code&amp;gt;anchors&amp;lt;/code&amp;gt;. QML koristi predloške (&lt;code&amp;gt;layout&amp;lt;/code&amp;gt;) bazirane na principu sidra (&lt;i&amp;gt;anchor&amp;lt;/i&amp;gt;) koji omogućavaju povezivanje sidra jednog elementa s drugim elementima kreirajući pri tome robusna sučelja.


[http://doc.qt.nokia.com/4.7/qml-text.html Text] ''[doc.qt.nokia.com]'' element je nepromjenjivo tekstualno polje. U primjeru ćemo ga ####### <code>buttonLabel</code>. Da bi postavili sadržaj [http://doc.qt.nokia.com/4.7/qml-text.html Text] ''[doc.qt.nokia.com]'' polja, potrebno je postaviti svojstvo <code>text</code>. ##### se nalazi unutar elementa [http://doc.qt.nokia.com/4.7/qml-rectangle.html Rectangle] ''[doc.qt.nokia.com]'' i da bi centrirali potrebno je povezati lokaciju [http://doc.qt.nokia.com/4.7/qml-text.html Text] ''[doc.qt.nokia.com]'' elementa s njegovim parent elementom, koji je u ovom slucaju &lt;i&gt;simplebutton&lt;/i&gt;.
Za &quot;MouseArea&amp;quot;:http://doc.qt.nokia.com/4.7/qml-mousearea.html postoji mnogo signala koji se aktiviraju pomicanjem miša unutar &quot;MouseArea&amp;quot;:http://doc.qt.nokia.com/4.7/qml-mousearea.html granica. Jedan od njih je &lt;code&amp;gt;onClicked&amp;lt;/code&amp;gt; i on se poziva svaki put kad se pritisne tipka miša, po defaultu lijeva. Akciju ćemo zatim povezati s &lt;code&amp;gt;onClicked&amp;lt;/code&amp;gt; signalom. U našem primjeru &lt;code&amp;gt;console.log()&lt;/code&amp;gt; ispisuje tekst svaki put kad bi se tipka miša pritisnula unutar granica &quot;MouseArea&amp;quot;:http://doc.qt.nokia.com/4.7/qml-mousearea.html. Metoda &lt;code&amp;gt;console.log()&lt;/code&amp;gt; je izuzetno korisna za potrebe traženja i ispravljanja grešaka u kodu kao i ispis teksta.


Ovaj ćemo izvorni kod snimiti u datoteku SimpleButton.qml. Pokrenut ćemo [http://doc.qt.nokia.com/4.7/qmlviewer.html qmlviewer] ''[doc.qt.nokia.com]'' program s parametrom <code>SimpleButton.qml</code> i prikazat će nam se sivi pravokutnik s upisanim tekstom.
Izvorni kod u &lt;code&amp;gt;SimpleButton.qml&amp;lt;/code&amp;gt; dovoljan je za prikaz dugmeta na ekranu te ispis teksta svaki put kad bi kliknuli na njega mišem.


[[Image:qml-texteditor1_simplebutton.png]]
<code><br />Rectangle {<br /> id:Button<br /> …


Da bismo implementirali interakciju s dugmetom, upotrijebiti ćemo <span class="caps">QML</span>-ov sistem za obradu događaja. Obrada događaja u <span class="caps">QML</span>-u je prilično slično sustavu signala i slotova u QT-u. Signali se emitiraju i pozivaju povezani slot.
property color buttonColor: &quot;lightblue&amp;quot;<br /> property color onHoverColor: &quot;gold&amp;quot;<br /> property color borderColor: &quot;white&amp;quot;


Dodajemo [http://doc.qt.nokia.com/4.7/qml-mousearea.html MouseArea] ''[doc.qt.nokia.com]'' našem <code>simplebutton</code> elementu. [http://doc.qt.nokia.com/4.7/qml-mousearea.html MouseArea] ''[doc.qt.nokia.com]'' element opisuje interaktivno područje unutar kojeg se detektiraju korinički pomaci miša. Za naše dugme, povezali smo cijeli [http://doc.qt.nokia.com/4.7/qml-mousearea.html MouseArea] ''[doc.qt.nokia.com]'' za područje dugmeta. Dio koda <code>anchors.fill</code> omogućuje pritup svojstvu <code>fill</code> unutar grupe svojstva <code>anchors</code>. <span class="caps">QML</span> koristi predloške (<code>layout</code>) bazirane na principu sidra (&lt;i&gt;anchor&lt;/i&gt;) koji omogućavaju povezivanje sidra jednog elementa s drugim elementima kreirajući pri tome robusna sučelja.
signal buttonClick()<br /> onButtonClick: {<br /> console.log(buttonLabel.text + &quot; clicked&amp;quot; )<br /> }


Za [http://doc.qt.nokia.com/4.7/qml-mousearea.html MouseArea] ''[doc.qt.nokia.com]'' postoji mnogo signala koji se aktiviraju pomicanjem miša unutar [http://doc.qt.nokia.com/4.7/qml-mousearea.html MouseArea] ''[doc.qt.nokia.com]'' granica. Jedan od njih je <code>onClicked</code> i on se poziva svaki put kad se pritisne tipka miša, po defaultu lijeva. Akciju ćemo zatim povezati s <code>onClicked</code> signalom. U našem primjeru <code>console.log()</code> ispisuje tekst svaki put kad bi se tipka miša pritisnula unutar granica [http://doc.qt.nokia.com/4.7/qml-mousearea.html MouseArea] ''[doc.qt.nokia.com]''. Metoda <code>console.log()</code> je izuzetno korisna za potrebe traženja i ispravljanja grešaka u kodu kao i ispis teksta.
MouseArea {<br /> onClicked: buttonClick()<br /> hoverEnabled: true<br /> onEntered: parent.border.color = onHoverColor<br /> onExited: parent.border.color = borderColor<br /> }


Izvorni kod u <code>SimpleButton.qml</code> dovoljan je za prikaz dugmeta na ekranu te ispis teksta svaki put kad bi kliknuli na njega mišem.
// determines the color of the button by using the conditional operator<br /> color: buttonMouseArea.pressed ? Qt.darker(buttonColor, 1.5) : buttonColor<br />}<br /></code>


U datoteci <code>Button.qml</code> nalazi se potpuno funkcionalno dugme. Izvorni kod uz ovaj vodič je djelomično skraćen s obzirom da se ti dijelovi kod nalaze u prijašnjim primjerima ili nisu relevantne za ovu temu.
U datoteci &lt;code&amp;gt;Button.qml&amp;lt;/code&amp;gt; nalazi se potpuno funkcionalno dugme. Izvorni kod uz ovaj vodič je djelomično skraćen s obzirom da se ti dijelovi kod nalaze u prijašnjim primjerima ili nisu relevantne za ovu temu.


Proizvoljna svojstva deklariraju se upotrebom “property type name” sintakse . U primjeru izvornog koda, svojstvo <code>buttonColor</code>, tip <code>color</code> je deklarirano i vezano uz vrijednost <code>“lightblue”</code>. Svojstvo <code>buttonColor</code> kasnije ćemo upotrijebiti u kondicionaloj operaciji kojom ćemo utvrditi boji dugmeta. Bitno je za primjetiti da je svojstvu vrijednost moguće dodijeliti upotrebom <code>”=”</code> operatora uz mogućnost dodijeljivanja vrijednosti upotrebom znaka <code>”:”</code>. Proizvoljna svojstva omogućuju pristup internim elementima izvan [http://doc.qt.nokia.com/4.7/qml-rectangle.html Rectangle] ''[doc.qt.nokia.com]'' objekta. Osnovni [http://doc.qt.nokia.com/4.7/qdeclarativebasictypes.html tipovi podatka] ''[doc.qt.nokia.com]'' s kojima <span class="caps">QML</span> radi su <code>int</code>, <code>string</code>, <code>real</code> kao i <code>variant</code>
Proizvoljna svojstva deklariraju se upotrebom &quot;property type name&amp;quot; sintakse . U primjeru izvornog koda, svojstvo &lt;code&amp;gt;buttonColor&amp;lt;/code&amp;gt;, tip &lt;code&amp;gt;color&amp;lt;/code&amp;gt; je deklarirano i vezano uz vrijednost &lt;code&amp;gt;&quot;lightblue&amp;quot;&lt;/code&amp;gt;. Svojstvo &lt;code&amp;gt;buttonColor&amp;lt;/code&amp;gt; kasnije ćemo upotrijebiti u kondicionaloj operaciji kojom ćemo utvrditi boji dugmeta. Bitno je za primjetiti da je svojstvu vrijednost moguće dodijeliti upotrebom &lt;code&amp;gt;&quot;=&quot;&lt;/code&amp;gt; operatora uz mogućnost dodijeljivanja vrijednosti upotrebom znaka &lt;code&amp;gt;&quot;:&quot;&lt;/code&amp;gt;. Proizvoljna svojstva omogućuju pristup internim elementima izvan &quot;Rectangle&amp;quot;:http://doc.qt.nokia.com/4.7/qml-rectangle.html objekta. Osnovni &quot;tipovi podatka&amp;quot;:http://doc.qt.nokia.com/4.7/qdeclarativebasictypes.html s kojima QML radi su &lt;code&amp;gt;int&amp;lt;/code&amp;gt;, &lt;code&amp;gt;string&amp;lt;/code&amp;gt;, &lt;code&amp;gt;real&amp;lt;/code&amp;gt; kao i &lt;code&amp;gt;variant&amp;lt;/code&amp;gt;


Povezivanjem <code>onEntered</code> i <code>onExited</code> signala s bojama, okvir dugmeta na ekranu promijenit će boju u žuto dok se pokazivač nađe unutar njegovih granica .
Povezivanjem &lt;code&amp;gt;onEntered&amp;lt;/code&amp;gt; i &lt;code&amp;gt;onExited&amp;lt;/code&amp;gt; signala s bojama, okvir dugmeta na ekranu promijenit će boju u žuto dok se pokazivač nađe unutar njegovih granica .


Signal <code>buttonClick()</code> deklariran je u &lt;i&gt;Button.qml&lt;/i&gt; datoteci postavljanjem ključne riječi ispred ###### signala. Svim signalim automatski se kreiraju vezane metode koje nose isti ##### kao signal. Kao rezultat dobijemo metodu <code>onButtonClick()</code> vezanu za signal <code>buttonClick</code>. Na metodu <code>onButtonClick()</code> zatim se veže akcija koja će se izvršiti.
Signal &lt;code&amp;gt;buttonClick()&lt;/code&amp;gt; deklariran je u &lt;i&amp;gt;Button.qml&amp;lt;/i&amp;gt; datoteci postavljanjem ključne riječi ispred naziva signala. Svim signalim automatski se kreiraju vezane metode koje nose isti naziv kao signal. Kao rezultat dobijemo metodu &lt;code&amp;gt;onButtonClick()&lt;/code&amp;gt; vezanu za signal &lt;code&amp;gt;buttonClick&amp;lt;/code&amp;gt;. Na metodu &lt;code&amp;gt;onButtonClick()&lt;/code&amp;gt; zatim se veže akcija koja će se izvršiti.


U našem primjeru, <code>onClicked</code> signal aktivirat će metodu <code>onButtonClick</code> koja će prikazati tekst. Metoda <code>onButtonClick</code> omogućuje vanjskim objektima pristup području dugmeta. Primjerice, elementi na sučelju mogu imati više od jedne deklaracije [http://doc.qt.nokia.com/4.7/qml-mousearea.html MouseArea] ''[doc.qt.nokia.com]'' a <code>buttonClick</code> signal će odrediti koja će vezana metoda bolje odraditi akciju vezanu na signal.
U našem primjeru, &lt;code&amp;gt;onClicked&amp;lt;/code&amp;gt; signal aktivirat će metodu &lt;code&amp;gt;onButtonClick&amp;lt;/code&amp;gt; koja će prikazati tekst. Metoda &lt;code&amp;gt;onButtonClick&amp;lt;/code&amp;gt; omogućuje vanjskim objektima pristup području dugmeta. Primjerice, elementi na sučelju mogu imati više od jedne deklaracije &quot;MouseArea&amp;quot;:http://doc.qt.nokia.com/4.7/qml-mousearea.html a &lt;code&amp;gt;buttonClick&amp;lt;/code&amp;gt; signal će odrediti koja će vezana metoda bolje odraditi akciju vezanu na signal.


Do sada smo svladali osnove implementacije elemenata u <span class="caps">QML</span>u za obradu osnovnih pokreta mišem. Kreirali smo [[http://doc.qt.nokia.com/4.7/qml-text.html|tekstualni]] element unutar objekta [http://doc.qt.nokia.com/4.7/qml-rectangle.html Rectangle] ''[doc.qt.nokia.com]'', prilagodli njegova svojstva i implementirali ponašanje koje odgovarta pokretima mišem. Koncept kreiranja elemenata unutar elemenata raširen je kroz cijelu aplikaciju.
Do sada smo svladali osnove implementacije elemenata u QMLu za obradu osnovnih pokreta mišem. Kreirali smo &quot;tekstualni&amp;quot;:&quot;Rectangle&amp;quot;:http://doc.qt.nokia.com/4.7/qml-text.html element unutar objekta &quot;Rectangle&amp;quot;:http://doc.qt.nokia.com/4.7/qml-rectangle.html, prilagodli njegova svojstva i implementirali ponašanje koje odgovarta pokretima mišem. Koncept kreiranja elemenata unutar elemenata raširen je kroz cijelu aplikaciju.


Ovo dugme je beskorisno ukoliko nije upotrebljen kao komponenta koja će izvršti neku akciju. U sljedećem dijelu vodiča kreirat ćemo meni koji će sadržavati neke od dugmadi.
Ovo dugme je beskorisno ukoliko nije upotrebljen kao komponenta koja će izvršti neku akciju. U sljedećem dijelu vodiča kreirat ćemo meni koji će sadržavati neke od dugmadi.


[[Image:qml-texteditor1_button.png]]
p=. [[Image:http://doc.qt.nokia.com/4.7/images/qml-texteditor1_button.png|http://doc.qt.nokia.com/4.7/images/qml-texteditor1_button.png]]
 
== Kreiranje izborničke (MENU) stranice ==
 
Do ovog tgrenutka pokrili smo kreiranje elemenata i pripadajućih akcija unutar jedne QML datoteke. U ovom dijelu vodića proći ćemo uvoz QML elemenata te ponovno korištenje postojećih elemenata u izgradnji drugih.
 
Izbornici prikazuju sadržaj liste s time da svaki od njih ima mogućnost izvršavanja akcije. U QMLu, izbornik se može kreirati na više načina. Prvo, kreirat ćemo izbornik koji sadrži dugmad koja će eventulano izvršavati različite akcije. Izvorni kod za izbornike nalazi se u datoteci &lt;code&amp;gt;FileMenu.qml&amp;lt;/code&amp;gt;.
 
<code><br />import Qt 4.7 import the main Qt QML module<br />import &quot;folderName&amp;quot; import the contents of the folder<br />import &quot;script.js&amp;quot; as Script import a Javascript file and name it as Script<br /></code>
 
Izvorni kod iznad pokazuje kako koristiti &lt;code&amp;gt;import&amp;lt;/code&amp;gt; ključnu riječ. Ona je neophodna ukoliko želimo koristiti JavaScript datoteke, ili QML datoteke a koje se ne nalaze unutaristog direktorija. S obzirom da se &lt;code&amp;gt;Button.qml&amp;lt;/code&amp;gt; nalazi u istom direktoriju kao i &lt;code&amp;gt;FileMenu.qml&amp;lt;/code&amp;gt;, za &lt;code&amp;gt;Button.qml&amp;lt;/code&amp;gt; nije potrebno koristiti &lt;code&amp;gt;import&amp;lt;/code&amp;gt; da bi ga upotrijebili. Button element možemo kreirati deklaracijom &lt;code&amp;gt;Button{}&lt;/code&amp;gt;, slično kao što smo radili deklaraciju &lt;code&amp;gt;Rectangle{}&lt;/code&amp;gt; elementa.
 
<code><br />Izvorni kod &lt;code&amp;gt;FileMenu.qml&amp;lt;/code&amp;gt;:
 
Row{<br /> anchors.centerIn: parent<br /> spacing: parent.width/6
 
Button{<br /> id: loadButton<br /> buttonColor: &quot;lightgrey&amp;quot;<br /> label: &quot;Load&amp;quot;<br /> }<br /> Button{<br /> buttonColor: &quot;grey&amp;quot;<br /> id: saveButton<br /> label: &quot;Save&amp;quot;<br /> }<br /> Button{<br /> id: exitButton<br /> label: &quot;Exit&amp;quot;<br /> buttonColor: &quot;darkgrey&amp;quot;
 
onButtonClick: Qt.quit()<br /> }<br /> }<br /></code>
 
U datoteci &lt;code&amp;gt;FileMenu.qml&amp;lt;/code&amp;gt; deklarirali smo tri &lt;code&amp;gt;Button&amp;lt;/code&amp;gt; elementa. Njih smo postavili unutar &lt;code&amp;gt;Row&amp;lt;/code&amp;gt; elementa, koji sve elemente koji se nalazu unutar njega postavlja u okomiti red. Deklaracija &lt;code&amp;gt;Button&amp;lt;/code&amp;gt; elementa nalazi se u &lt;code&amp;gt;Button.qml&amp;lt;/code&amp;gt; datoteci koja je ista ona datoteka koju smo koritili u prethodnom primjeru. Na svojstva elementa &lt;code&amp;gt;Button&amp;lt;/code&amp;gt; mogu se vezati nove vrijednosti i time prepisati osnovna svojstva elementa postavljena u &lt;code&amp;gt;Button.qml&amp;lt;/code&amp;gt;. Klikom na dugme &lt;code&amp;gt;exitButton&amp;lt;/code&amp;gt; aplikacije će se zatvoriti. Treba uzeti u obzir da će se uz metodu &lt;code&amp;gt;onButtonClick&amp;lt;/code&amp;gt; vezanu na &lt;code&amp;gt;exitButton&amp;lt;/code&amp;gt; dugme istovremno aktivirati i metoda &lt;code&amp;gt;onButtonClick&amp;lt;/code&amp;gt; koja se nalazi unutar &lt;code&amp;gt;Button.qml&amp;lt;/code&amp;gt; datoteke.
 
p=. [[Image:http://doc.qt.nokia.com/4.7/images/qml-texteditor1_filemenu.png|Izbornik]]
 
&lt;code&amp;gt;Row&amp;lt;/code&amp;gt; se deklarira unutar deklaracije &lt;code&amp;gt;Rectangle&amp;lt;/code&amp;gt; time kreirajući &lt;code&amp;gt;Rectangle&amp;lt;/code&amp;gt; koji sadrži u sebi red dugmadi. Ovaj dodatni &lt;code&amp;gt;Rectangle&amp;lt;/code&amp;gt; element indirektno utječe na organizaciju reda dugmadi unutar menija.
 
Deklaracija izbornika &lt;code&amp;gt;Edit&amp;lt;/code&amp;gt; je u ovoj fazi prilično slična. Izbornik sadrži dugmad s nazivima: &lt;code&amp;gt;Cut&amp;lt;/code&amp;gt;, &lt;code&amp;gt;Paste&amp;lt;/code&amp;gt; i &lt;code&amp;gt;Select All&amp;lt;/code&amp;gt;
 
p=. [[Image:http://doc.qt.nokia.com/4.7/images/qml-texteditor1_editmenu.png|http://doc.qt.nokia.com/4.7/images/qml-texteditor1_editmenu.png]]


==Kreiranje izborničke (<span class="caps">MENU</span>) stranice==
Oboružani znanjem o uvozu i prilagođavanju od prije postojećih elemenata, sad možemo spojiti izborničke stranice u izborničku traku, koja će se sastojati od dugmadi za izbor menija i dobiti dobar primjer strukturiranja podataka upotrebom QML-a.


Do ovog tgrenutka pokrili smo kreiranje elemenata i pripadajućih akcija unutar jedne <span class="caps">QML</span> datoteke. U ovom dijelu vodića proći ćemo uvoz <span class="caps">QML</span> elemenata te ponovno korištenje postojećih elemenata u izgradnji drugih.
== Implementacija izborničke trake ==


Izbornici prikazuju sadržaj liste s time da svaki od njih ima mogućnost izvršavanja akcije. U <span class="caps">QML</span>u, izbornik se može kreirati na više načina. Prvo, kreirat ćemo izbornik koji sadrži dugmad koja će eventulano izvršavati različite akcije. Izvorni kod za izbornike nalazi se u datoteci <code>FileMenu.qml</code>.
Naš tekst editor treba prikazivati izbornik upotrebom izborničke trake. Izbornička traka izmjenjivat će različite menije omogućujući koriniku izbor željene akcije. Izmjena izbornika podrazumjeva da su izbornicima treba malo više strukturiranja od običnog prikaza u redu. QML koristi modele i predloške za pregled strukturiranih podataka.


Izvorni kod iznad pokazuje kako koristiti <code>import</code> ključnu riječ. Ona je neophodna ukoliko želimo koristiti JavaScript datoteke, ili <span class="caps">QML</span> datoteke a koje se ne nalaze unutaristog direktorija. S obzirom da se <code>Button.qml</code> nalazi u istom direktoriju kao i <code>FileMenu.qml</code>, za <code>Button.qml</code> nije potrebno koristiti <code>import</code> da bi ga upotrijebili. Button element možemo kreirati deklaracijom <code>Button{}</code>, slično kao što smo radili deklaraciju <code>Rectangle{}</code> elementa.
== Upotreba podatkovnih modela i predložaka ==


U datoteci <code>FileMenu.qml</code> deklarirali smo tri <code>Button</code> elementa. Njih smo postavili unutar <code>Row</code> elementa, koji sve elemente koji se nalazu unutar njega postavlja u okomiti red. Deklaracija <code>Button</code> elementa nalazi se u <code>Button.qml</code> datoteci koja je ista ona datoteka koju smo koritili u prethodnom primjeru. Na svojstva elementa <code>Button</code> mogu se vezati nove vrijednosti i time prepisati osnovna svojstva elementa postavljena u <code>Button.qml</code>. Klikom na dugme <code>exitButton</code> aplikacije će se zatvoriti. Treba uzeti u obzir da će se uz metodu <code>onButtonClick</code> vezanu na <code>exitButton</code> dugme istovremno aktivirati i metoda <code>onButtonClick</code> koja se nalazi unutar <code>Button.qml</code> datoteke.
QML dolazi s različitim &quot;podatkovim modelima&amp;quot;:http://doc.qt.nokia.com/4.7/qdeclarativemodels.htm i predlošcima za prikaz istih. Naša izbornička traka prikazivati će izbornike u listi, sa zaglavljem u kojem će se nalaziti nazivi redova. Lista izbornika deklarira se unutar &quot;VisualItemModel&amp;quot;:http://doc.qt.nokia.com/4.7/qml-visualitemmodel.html elementa. &quot;VisualItemModel&amp;quot;:http://doc.qt.nokia.com/4.7/qml-visualitemmodel.html element sadrži elemente koji u sebi već sadrže &lt;code&amp;gt;Rectangle&amp;lt;/code&amp;gt; elemente kao i UI elemente koje smo uvezi. Druge tipove modele kao što je &quot;ListModel&amp;quot;:http://doc.qt.nokia.com/4.7/qml-listmodel.html moraju koristiti delegate da bi prikazali svoje podatke.


[[Image:qml-texteditor1_filemenu.png|Izbornik]]
Deklariramo dva vizualna elementa unutar &lt;code&amp;gt;menuListModel&amp;lt;/code&amp;gt;, &lt;code&amp;gt;FileMenu&amp;lt;/code&amp;gt; i &lt;code&amp;gt;EditMenu&amp;lt;/code&amp;gt;. Prilagođujemo dva menija i prikazujemo ih upotrebom &lt;code&amp;gt;ListView&amp;lt;/code&amp;gt;. &lt;code&amp;gt;MenuBar.qml&amp;lt;/code&amp;gt; datoteka sadrži QML deklaracije a &lt;code&amp;gt;EditMenu.qml&amp;lt;/code&amp;gt; swadrži jednostavni &lt;code&amp;gt;Edit&amp;lt;/code&amp;gt; izbornik.


<code>Row</code> se deklarira unutar deklaracije <code>Rectangle</code> time kreirajući <code>Rectangle</code> koji sadrži u sebi red dugmadi. Ovaj dodatni <code>Rectangle</code> element indirektno utječe na organizaciju reda dugmadi unutar menija.
<code>VisualItemModel {<br /> id: menuListModel<br /> FileMenu{<br /> width: menuListView.width<br /> height: menuBar.height<br /> color: fileColor<br /> }<br /> EditMenu{<br /> color: editColor<br /> width: menuListView.width<br /> height: menuBar.height<br /> }<br />}<br /></code>


Deklaracija izbornika <code>Edit</code> je u ovoj fazi prilično slična. Izbornik sadrži dugmad s ########: <code>Cut</code>, <code>Paste</code> i <code>Select All</code>
&quot;ListView&amp;quot;:http://doc.qt.nokia.com/4.7/qml-listview.html element prikazuje model prema delegatu. Delagat mode deklarirati da se elementi modela prikazuju unutar &lt;code&amp;gt;Row&amp;lt;/code&amp;gt; elementa ili da ih se prikaže unutar mrežnog prikaza. Naš &lt;code&amp;gt;menuListModel&amp;lt;/code&amp;gt; već ima vidljive elemente te nije potrebno deklarirati delegata.


[[Image:qml-texteditor1_editmenu.png]]
<code>ListView {<br /> id: menuListView


Oboružani znanjem o uvozu i prilagođavanju od prije postojećih elemenata, sad možemo spojiti izborničke stranice u izborničku traku, koja će se sastojati od dugmadi za izbor menija i dobiti dobar primjer strukturiranja podataka upotrebom <span class="caps">QML</span>-a.
//Anchors are set to react to window anchors<br /> anchors.fill:parent<br /> anchors.bottom: parent.bottom<br /> width:parent.width<br /> height: parent.height


==Implementacija izborničke trake==
//the model contains the data<br /> model: menuListModel


Naš tekst editor treba prikazivati izbornik upotrebom izborničke trake. Izbornička traka izmjenjivat će različite menije omogućujući koriniku izbor željene akcije. Izmjena izbornika podrazumjeva da su izbornicima treba malo više strukturiranja od običnog prikaza u redu. <span class="caps">QML</span> koristi modele i predloške za pregled strukturiranih podataka.
//control the movement of the menu switching<br /> snapMode: ListView.SnapOneItem<br /> orientation: ListView.Horizontal<br /> boundsBehavior: Flickable.StopAtBounds<br /> flickDeceleration: 5000<br /> highlightFollowsCurrentItem: true<br /> highlightMoveDuration:240<br /> highlightRangeMode: ListView.StrictlyEnforceRange<br />}<br /></code>


==Upotreba podatkovnih modela i predložaka==
U to &lt;code&amp;gt;ListView&amp;lt;/code&amp;gt; nasljeđuje &lt;code&amp;gt;Flickable&amp;lt;/code&amp;gt; i time reagira na pomake miša. Zasdnji dio koda iznad postavlja &lt;code&amp;gt;Flickable&amp;lt;/code&amp;gt; svojstva da reagiraju na pokrete unutar našeg programa. PReciznije, svojstvo &lt;code&amp;gt;highlightMoveDuration&amp;lt;/code&amp;gt; određuje vrijeme izmjene između dva izbornika. Veća vrijednost, &lt;code&amp;gt;highlightMoveDuration&amp;lt;/code&amp;gt; uzrokovat će sporiju izmjenu izbornika.


<span class="caps">QML</span> dolazi s različitim [http://doc.qt.nokia.com/4.7/qdeclarativemodels.htm podatkovim modelima] ''[doc.qt.nokia.com]'' i predlošcima za prikaz istih. Naša izbornička traka prikazivati će izbornike u listi, sa zaglavljem u kojem će se nalaziti ###### redova. Lista izbornika deklarira se unutar [http://doc.qt.nokia.com/4.7/qml-visualitemmodel.html VisualItemModel] ''[doc.qt.nokia.com]'' elementa. [http://doc.qt.nokia.com/4.7/qml-visualitemmodel.html VisualItemModel] ''[doc.qt.nokia.com]'' element sadrži elemente koji u sebi već sadrže <code>Rectangle</code> elemente kao i UI elemente koje smo uvezi. Druge tipove modele kao što je [http://doc.qt.nokia.com/4.7/qml-listmodel.html ListModel] ''[doc.qt.nokia.com]'' moraju koristiti delegate da bi prikazali svoje podatke.
&lt;code&amp;gt;ListView&amp;lt;/code&amp;gt; sadržava sve elemente po indeksima i svaki vizualni element je dostupan po tom indeksu, soritano po redu deklaracije. Izmjena &lt;code&amp;gt;currentIndex&amp;lt;/code&amp;gt; izmjenjuje označeni element unutar &lt;code&amp;gt;ListView&amp;lt;/code&amp;gt; elementa. Ovaj efekt dobvro je vidljiv na zaglavlju našeg izbornika. U redu se nalaze dva dugmeta koji kad se kliken na njih mijenjaju trenutno odabrani izbornik. Dugme &lt;code&amp;gt;fileButton&amp;lt;/code&amp;gt; izmijenit će trenbutno odabrani izbornik na &lt;code&amp;gt;File&amp;lt;/code&amp;gt; izbornik, s indeksom 0 pošto je &lt;code&amp;gt;FileMenu&amp;lt;/code&amp;gt; prvi deklariran unutar &lt;code&amp;gt;menuListModel&amp;lt;/code&amp;gt; elementa. Slično tome, &lt;code&amp;gt;editButton&amp;lt;/code&amp;gt; će promijeniti trenutni izbornik na &lt;code&amp;gt;EditMenu&amp;lt;/code&amp;gt;.


Deklariramo dva vizualna elementa unutar <code>menuListModel</code>, <code>FileMenu</code> i <code>EditMenu</code>. Prilagođujemo dva menija i prikazujemo ih upotrebom <code>ListView</code>. <code>MenuBar.qml</code> datoteka sadrži <span class="caps">QML</span> deklaracije a <code>EditMenu.qml</code> swadrži jednostavni <code>Edit</code> izbornik.
&lt;code&amp;gt;Rectangle&amp;lt;/code&amp;gt; objekt &lt;code&amp;gt;labelList&amp;lt;/code&amp;gt; imna svojstvo &lt;i&amp;gt;z&amp;lt;/i&amp;gt; postavljenmo na 1, što znači da će biti prikazan ispred izborničke trake. ELementi s nižom &lt;i&amp;gt;z&amp;lt;/i&amp;gt; vrijednosti bit će prikazane ispred elementa s višom &lt;i&amp;gt;z&amp;lt;/i&amp;gt; vrijednoti. Osnovna vrijednost &lt;i&amp;gt;z&amp;lt;/i&amp;gt; je 0.


[http://doc.qt.nokia.com/4.7/qml-listview.html ListView] ''[doc.qt.nokia.com]'' element prikazuje model prema delegatu. Delagat mode deklarirati da se elementi modela prikazuju unutar <code>Row</code> elementa ili da ih se prikaže unutar mrežnog prikaza. Naš <code>menuListModel</code> već ima vidljive elemente te nije potrebno deklarirati delegata.
<code>Rectangle{<br /> id: labelList<br /> …<br /> z: 1<br /> Row{<br /> anchors.centerIn: parent<br /> spacing:40<br /> Button{<br /> label: &quot;File&amp;quot;<br /> id: fileButton<br /> …<br /> onButtonClick: menuListView.currentIndex = 0<br /> }<br /> Button{<br /> id: editButton<br /> label: &quot;Edit&amp;quot;<br /> …<br /> onButtonClick: menuListView.currentIndex = 1<br /> }<br /> }<br />}<br /></code>


U to <code>ListView</code> nasljeđuje <code>Flickable</code> i time reagira na pomake miša. Zasdnji dio koda iznad postavlja <code>Flickable</code> svojstva da reagiraju na pokrete unutar našeg programa. PReciznije, svojstvo <code>highlightMoveDuration</code> određuje vrijeme izmjene između dva izbornika. Veća vrijednost, <code>highlightMoveDuration</code> uzrokovat će sporiju izmjenu izbornika.
The menu bar we just created can be flicked to access the menus or by clicking on the menu names at the top. Switching menu screens feel intuitive and responsive.<br />Izbornička traka koju smo upravo kreirali može biti manipulirana da bi se izbornicima pristupalo klikajući po nazivu izbornika na vrhu. Izmjena izborničkih ekrana djeluje intuitivno i ima brzi odaziv.


<code>ListView</code> sadržava sve elemente po indeksima i svaki vizualni element je dostupan po tom indeksu, soritano po redu deklaracije. Izmjena <code>currentIndex</code> izmjenjuje označeni element unutar <code>ListView</code> elementa. Ovaj efekt dobvro je vidljiv na zaglavlju našeg izbornika. U redu se nalaze dva dugmeta koji kad se kliken na njih mijenjaju trenutno odabrani izbornik. Dugme <code>fileButton</code> izmijenit će trenbutno odabrani izbornik na <code>File</code> izbornik, s indeksom 0 pošto je <code>FileMenu</code> prvi deklariran unutar <code>menuListModel</code> elementa. Slično tome, <code>editButton</code> će promijeniti trenutni izbornik na <code>EditMenu</code>.
p=. [[Image:http://doc.qt.nokia.com/4.7/images/qml-texteditor2_menubar.png|http://doc.qt.nokia.com/4.7/images/qml-texteditor2_menubar.png]]


<code>Rectangle</code> objekt <code>labelList</code> imna svojstvo &lt;i&gt;z&lt;/i&gt; postavljenmo na 1, što znači da će biti prikazan ispred izborničke trake. ELementi s nižom &lt;i&gt;z&lt;/i&gt; vrijednosti bit će prikazane ispred elementa s višom &lt;i&gt;z&lt;/i&gt; vrijednoti. Osnovna vrijednost &lt;i&gt;z&lt;/i&gt; je 0.
== Izrada Text Editora ==


The menu bar we just created can be flicked to access the menus or by clicking on the menu names at the top. Switching menu screens feel intuitive and responsive.<br /> Izbornička traka koju smo upravo kreirali može biti manipulirana da bi se izbornicima pristupalo klikajući po ###### izbornika na vrhu. Izmjena izborničkih ekrana djeluje intuitivno i ima brzi odaziv.
=== Deklaracija Text Area ===


[[Image:qml-texteditor2_menubar.png]]
Naš Tekst editor ne bi bio tekst editor a da nema u sebi površinu na kojoj možemo raditi izmjene na tekstu. QML ima &quot;TextEdit&amp;quot;:http://doc.qt.nokia.com/4.7/qml-textedit.html element koji omogućuje deklaraciju područja za prikaz i izmjene teksta. &quot;TextEdit&amp;quot;:http://doc.qt.nokia.com/4.7/qml-textedit.html se razlikuje od običnog &quot;Text&amp;quot;:http://doc.qt.nokia.com/4.7/qml-text.html koji nema mogućnost izmjene teksta.


==Izrada Text Editora==
<code><br /> TextEdit{<br /> id: textEditor<br /> anchors.fill:parent<br /> width:parent.width; height:parent.height<br /> color:&quot;midnightblue&amp;quot;<br /> focus: true


===Deklaracija Text Area===
wrapMode: TextEdit.Wrap


Naš Tekst editor ne bi bio tekst editor a da nema u sebi površinu na kojoj možemo raditi izmjene na tekstu. <span class="caps">QML</span> ima [http://doc.qt.nokia.com/4.7/qml-textedit.html TextEdit] ''[doc.qt.nokia.com]'' element koji omogućuje deklaraciju područja za prikaz i izmjene teksta. [http://doc.qt.nokia.com/4.7/qml-textedit.html TextEdit] ''[doc.qt.nokia.com]'' se razlikuje od običnog [http://doc.qt.nokia.com/4.7/qml-text.html Text] ''[doc.qt.nokia.com]'' koji nema mogućnost izmjene teksta.
onCursorRectangleChanged: flickArea.ensureVisible(cursorRectangle)<br /> }

Revision as of 11:26, 24 February 2015

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

Početak programiranja u QML-u

Dobrodošli u svijet QMLa, opisnog UI jezika. U ovom vodiču kreirat ćemo jednostavni editor teksta upotrebom QMLa. Nakon što završite s čitanjem ovog vodiča, trebali biste biti spremni za razvoj vlastitih aplikacija upotrebom QMLa i C+.
h2. QML u izradi korisničkog sučelja
Aplikacija koju ćemo raditi je jednostavni tekstualni editor koji učitava, snima te izvodi jednostavne funkcije na tekstu. Ovaj vodič sastoji se od dva dijela. U prvom dijelu obrađuju se dizajn i izgled aplikacije te ponašanje iste upotrebom opsinog jezika u QMLu. U drugom dijelu, učitavanje i snimanje datoteke bit će implementirano koriteći Qt C. Upotrebom "Qt Meta-Object System&quot;:http://doc.qt.nokia.com/4.7/metaobjects.html omogućujemo QML-ovim elementima pristup C+ metodama. Radeći u Qt C++ i QML-u, lako je odvojiti logiku korisničkog sučelja od ostatka aplikacije.

p=. Texteditor

Da bi pokrenuli QML primjer proslijediti QML datoteku "qmlviewer&quot;:http://doc.qt.nokia.com/4.7/qmlviewer.html programu. C++ dijelovi ovog vodiča predpostavljaju da čitatelj posjeduje osnovno znanje o kreiranju izvršnih datoteka iz Qt projekata.

Definicija Dugmadi i Menija

Osnovni elementi - dugme

Započet ćemo rad na tekst editoru kreiranjem dugmeta. Funkcionalno, dugme se sastoji od područja osjetljivog na akcije miša i naslov. Dugmad izvršava akcije nakon što korisnik klikne na njega.

U QML-u, osnovni vizualni element je "Rectangle&quot;:http://doc.qt.nokia.com/4.7/qml-rectangle.html. "Rectangle&quot;:http://doc.qt.nokia.com/4.7/qml-rectangle.html ima svojstva kojima se određuje njegov izgled i položaj.

<br />import Qt 4.7<br />Rectangle{<br /> id:simplebutton<br /> color: &quot;grey&amp;quot;<br /> width: 150<br /> height: 80<br /> Text{<br /> id: buttonLabel<br /> text: &quot;button label&amp;quot;<br /> anchors.centerIn: parent;<br /> anchors.verticalCenterOffset: 1<br /> }<br />}<br />

Prvo, linija koda <code&gt;import Qt 4.7&lt;/code&gt; omogućuje "qmlviewer&quot;:http://doc.qt.nokia.com/4.7/qmlviewer.html alatom da uveze QML element koje ćemo kasnije koristiti. Ova linija je neophodna za svaku QML datoteku. Primjetite da koristimo i verziju Qt-a pri tome.

Ovaj jednostavi element ima unikatni naziv, <code&gt;simplebutton&lt;/code&gt; koji je vezan za svojstvo <code&gt;id&lt;/code&gt;. Svojstva elementa "Rectangle&quot;:http://doc.qt.nokia.com/4.7/qml-rectangle.html vežu se za vrijednosti, navođenjem svojstva iza kojeg bi uslijedila dvotočka a zatim vrijednost. U primjeru izvornog koda, siva boje postavljenja je za vrijednost boje(<code&gt;color&lt;/code&gt;) "Rectangle&quot;:http://doc.qt.nokia.com/4.7/qml-rectangle.html elementa. Na isti način postavljena su svojstva za visinu(<code&gt;height&lt;/code&gt;) i širinu(<code&gt;width&lt;/code&gt;) elementa.

"Text&quot;:http://doc.qt.nokia.com/4.7/qml-text.html element je nepromjenjivo tekstualno polje. U primjeru ćemo ga nazvati <code&gt;buttonLabel&lt;/code&gt;. Da bi postavili sadržaj "Text&quot;:http://doc.qt.nokia.com/4.7/qml-text.html polja, potrebno je postaviti svojstvo <code&gt;text&lt;/code&gt;. Naziv se nalazi unutar elementa "Rectangle&quot;:http://doc.qt.nokia.com/4.7/qml-rectangle.html i da bi centrirali potrebno je povezati lokaciju "Text&quot;:http://doc.qt.nokia.com/4.7/qml-text.html elementa s njegovim parent elementom, koji je u ovom slucaju <i&gt;simplebutton&lt;/i&gt;.

Ovaj ćemo izvorni kod snimiti u datoteku SimpleButton.qml. Pokrenut ćemo "qmlviewer&quot;:http://doc.qt.nokia.com/4.7/qmlviewer.html program s parametrom <code&gt;SimpleButton.qml&lt;/code&gt; i prikazat će nam se sivi pravokutnik s upisanim tekstom.

p=. http://doc.qt.nokia.com/4.7/images/qml-texteditor1_simplebutton.png

Da bismo implementirali interakciju s dugmetom, upotrijebiti ćemo QML-ov sistem za obradu događaja. Obrada događaja u QML-u je prilično slično sustavu signala i slotova u QT-u. Signali se emitiraju i pozivaju povezani slot.

<br />Rectangle{<br /> id:simplebutton<br /> 

MouseArea{<br /> id: buttonMouseArea

anchors.fill: parent //anchor all sides of the mouse area to the rectangle's anchors<br /> //onClicked handles valid mouse button clicks<br /> onClicked: console.log(buttonLabel.text + &quot; clicked&amp;quot; )<br /> }<br />}<br />

Dodajemo "MouseArea&quot;:http://doc.qt.nokia.com/4.7/qml-mousearea.html našem <code&gt;simplebutton&lt;/code&gt; elementu. "MouseArea&quot;:http://doc.qt.nokia.com/4.7/qml-mousearea.html element opisuje interaktivno područje unutar kojeg se detektiraju korinički pomaci miša. Za naše dugme, povezali smo cijeli "MouseArea&quot;:http://doc.qt.nokia.com/4.7/qml-mousearea.html za područje dugmeta. Dio koda <code&gt;anchors.fill&lt;/code&gt; omogućuje pritup svojstvu <code&gt;fill&lt;/code&gt; unutar grupe svojstva <code&gt;anchors&lt;/code&gt;. QML koristi predloške (<code&gt;layout&lt;/code&gt;) bazirane na principu sidra (<i&gt;anchor&lt;/i&gt;) koji omogućavaju povezivanje sidra jednog elementa s drugim elementima kreirajući pri tome robusna sučelja.

Za "MouseArea&quot;:http://doc.qt.nokia.com/4.7/qml-mousearea.html postoji mnogo signala koji se aktiviraju pomicanjem miša unutar "MouseArea&quot;:http://doc.qt.nokia.com/4.7/qml-mousearea.html granica. Jedan od njih je <code&gt;onClicked&lt;/code&gt; i on se poziva svaki put kad se pritisne tipka miša, po defaultu lijeva. Akciju ćemo zatim povezati s <code&gt;onClicked&lt;/code&gt; signalom. U našem primjeru <code&gt;console.log()</code&gt; ispisuje tekst svaki put kad bi se tipka miša pritisnula unutar granica "MouseArea&quot;:http://doc.qt.nokia.com/4.7/qml-mousearea.html. Metoda <code&gt;console.log()</code&gt; je izuzetno korisna za potrebe traženja i ispravljanja grešaka u kodu kao i ispis teksta.

Izvorni kod u <code&gt;SimpleButton.qml&lt;/code&gt; dovoljan je za prikaz dugmeta na ekranu te ispis teksta svaki put kad bi kliknuli na njega mišem.

<br />Rectangle {<br /> id:Button<br /> 

property color buttonColor: &quot;lightblue&amp;quot;<br /> property color onHoverColor: &quot;gold&amp;quot;<br /> property color borderColor: &quot;white&amp;quot;

signal buttonClick()<br /> onButtonClick: {<br /> console.log(buttonLabel.text + &quot; clicked&amp;quot; )<br /> }

MouseArea {<br /> onClicked: buttonClick()<br /> hoverEnabled: true<br /> onEntered: parent.border.color = onHoverColor<br /> onExited: parent.border.color = borderColor<br /> }

// determines the color of the button by using the conditional operator<br /> color: buttonMouseArea.pressed ? Qt.darker(buttonColor, 1.5) : buttonColor<br />}<br />

U datoteci <code&gt;Button.qml&lt;/code&gt; nalazi se potpuno funkcionalno dugme. Izvorni kod uz ovaj vodič je djelomično skraćen s obzirom da se ti dijelovi kod nalaze u prijašnjim primjerima ili nisu relevantne za ovu temu.

Proizvoljna svojstva deklariraju se upotrebom "property type name&quot; sintakse . U primjeru izvornog koda, svojstvo <code&gt;buttonColor&lt;/code&gt;, tip <code&gt;color&lt;/code&gt; je deklarirano i vezano uz vrijednost <code&gt;"lightblue&quot;</code&gt;. Svojstvo <code&gt;buttonColor&lt;/code&gt; kasnije ćemo upotrijebiti u kondicionaloj operaciji kojom ćemo utvrditi boji dugmeta. Bitno je za primjetiti da je svojstvu vrijednost moguće dodijeliti upotrebom <code&gt;"="</code&gt; operatora uz mogućnost dodijeljivanja vrijednosti upotrebom znaka <code&gt;":"</code&gt;. Proizvoljna svojstva omogućuju pristup internim elementima izvan "Rectangle&quot;:http://doc.qt.nokia.com/4.7/qml-rectangle.html objekta. Osnovni "tipovi podatka&quot;:http://doc.qt.nokia.com/4.7/qdeclarativebasictypes.html s kojima QML radi su <code&gt;int&lt;/code&gt;, <code&gt;string&lt;/code&gt;, <code&gt;real&lt;/code&gt; kao i <code&gt;variant&lt;/code&gt;

Povezivanjem <code&gt;onEntered&lt;/code&gt; i <code&gt;onExited&lt;/code&gt; signala s bojama, okvir dugmeta na ekranu promijenit će boju u žuto dok se pokazivač nađe unutar njegovih granica .

Signal <code&gt;buttonClick()</code&gt; deklariran je u <i&gt;Button.qml&lt;/i&gt; datoteci postavljanjem ključne riječi ispred naziva signala. Svim signalim automatski se kreiraju vezane metode koje nose isti naziv kao signal. Kao rezultat dobijemo metodu <code&gt;onButtonClick()</code&gt; vezanu za signal <code&gt;buttonClick&lt;/code&gt;. Na metodu <code&gt;onButtonClick()</code&gt; zatim se veže akcija koja će se izvršiti.

U našem primjeru, <code&gt;onClicked&lt;/code&gt; signal aktivirat će metodu <code&gt;onButtonClick&lt;/code&gt; koja će prikazati tekst. Metoda <code&gt;onButtonClick&lt;/code&gt; omogućuje vanjskim objektima pristup području dugmeta. Primjerice, elementi na sučelju mogu imati više od jedne deklaracije "MouseArea&quot;:http://doc.qt.nokia.com/4.7/qml-mousearea.html a <code&gt;buttonClick&lt;/code&gt; signal će odrediti koja će vezana metoda bolje odraditi akciju vezanu na signal.

Do sada smo svladali osnove implementacije elemenata u QMLu za obradu osnovnih pokreta mišem. Kreirali smo "tekstualni&quot;:"Rectangle&quot;:http://doc.qt.nokia.com/4.7/qml-text.html element unutar objekta "Rectangle&quot;:http://doc.qt.nokia.com/4.7/qml-rectangle.html, prilagodli njegova svojstva i implementirali ponašanje koje odgovarta pokretima mišem. Koncept kreiranja elemenata unutar elemenata raširen je kroz cijelu aplikaciju.

Ovo dugme je beskorisno ukoliko nije upotrebljen kao komponenta koja će izvršti neku akciju. U sljedećem dijelu vodiča kreirat ćemo meni koji će sadržavati neke od dugmadi.

p=. http://doc.qt.nokia.com/4.7/images/qml-texteditor1_button.png

Kreiranje izborničke (MENU) stranice

Do ovog tgrenutka pokrili smo kreiranje elemenata i pripadajućih akcija unutar jedne QML datoteke. U ovom dijelu vodića proći ćemo uvoz QML elemenata te ponovno korištenje postojećih elemenata u izgradnji drugih.

Izbornici prikazuju sadržaj liste s time da svaki od njih ima mogućnost izvršavanja akcije. U QMLu, izbornik se može kreirati na više načina. Prvo, kreirat ćemo izbornik koji sadrži dugmad koja će eventulano izvršavati različite akcije. Izvorni kod za izbornike nalazi se u datoteci <code&gt;FileMenu.qml&lt;/code&gt;.

<br />import Qt 4.7 import the main Qt QML module<br />import &quot;folderName&amp;quot; import the contents of the folder<br />import &quot;script.js&amp;quot; as Script import a Javascript file and name it as Script<br />

Izvorni kod iznad pokazuje kako koristiti <code&gt;import&lt;/code&gt; ključnu riječ. Ona je neophodna ukoliko želimo koristiti JavaScript datoteke, ili QML datoteke a koje se ne nalaze unutaristog direktorija. S obzirom da se <code&gt;Button.qml&lt;/code&gt; nalazi u istom direktoriju kao i <code&gt;FileMenu.qml&lt;/code&gt;, za <code&gt;Button.qml&lt;/code&gt; nije potrebno koristiti <code&gt;import&lt;/code&gt; da bi ga upotrijebili. Button element možemo kreirati deklaracijom <code&gt;Button{}</code&gt;, slično kao što smo radili deklaraciju <code&gt;Rectangle{}</code&gt; elementa.

<br />Izvorni kod &lt;code&amp;gt;FileMenu.qml&amp;lt;/code&amp;gt;:

Row{<br /> anchors.centerIn: parent<br /> spacing: parent.width/6

Button{<br /> id: loadButton<br /> buttonColor: &quot;lightgrey&amp;quot;<br /> label: &quot;Load&amp;quot;<br /> }<br /> Button{<br /> buttonColor: &quot;grey&amp;quot;<br /> id: saveButton<br /> label: &quot;Save&amp;quot;<br /> }<br /> Button{<br /> id: exitButton<br /> label: &quot;Exit&amp;quot;<br /> buttonColor: &quot;darkgrey&amp;quot;

onButtonClick: Qt.quit()<br /> }<br /> }<br />

U datoteci <code&gt;FileMenu.qml&lt;/code&gt; deklarirali smo tri <code&gt;Button&lt;/code&gt; elementa. Njih smo postavili unutar <code&gt;Row&lt;/code&gt; elementa, koji sve elemente koji se nalazu unutar njega postavlja u okomiti red. Deklaracija <code&gt;Button&lt;/code&gt; elementa nalazi se u <code&gt;Button.qml&lt;/code&gt; datoteci koja je ista ona datoteka koju smo koritili u prethodnom primjeru. Na svojstva elementa <code&gt;Button&lt;/code&gt; mogu se vezati nove vrijednosti i time prepisati osnovna svojstva elementa postavljena u <code&gt;Button.qml&lt;/code&gt;. Klikom na dugme <code&gt;exitButton&lt;/code&gt; aplikacije će se zatvoriti. Treba uzeti u obzir da će se uz metodu <code&gt;onButtonClick&lt;/code&gt; vezanu na <code&gt;exitButton&lt;/code&gt; dugme istovremno aktivirati i metoda <code&gt;onButtonClick&lt;/code&gt; koja se nalazi unutar <code&gt;Button.qml&lt;/code&gt; datoteke.

p=. Izbornik

<code&gt;Row&lt;/code&gt; se deklarira unutar deklaracije <code&gt;Rectangle&lt;/code&gt; time kreirajući <code&gt;Rectangle&lt;/code&gt; koji sadrži u sebi red dugmadi. Ovaj dodatni <code&gt;Rectangle&lt;/code&gt; element indirektno utječe na organizaciju reda dugmadi unutar menija.

Deklaracija izbornika <code&gt;Edit&lt;/code&gt; je u ovoj fazi prilično slična. Izbornik sadrži dugmad s nazivima: <code&gt;Cut&lt;/code&gt;, <code&gt;Paste&lt;/code&gt; i <code&gt;Select All&lt;/code&gt;

p=. http://doc.qt.nokia.com/4.7/images/qml-texteditor1_editmenu.png

Oboružani znanjem o uvozu i prilagođavanju od prije postojećih elemenata, sad možemo spojiti izborničke stranice u izborničku traku, koja će se sastojati od dugmadi za izbor menija i dobiti dobar primjer strukturiranja podataka upotrebom QML-a.

Implementacija izborničke trake

Naš tekst editor treba prikazivati izbornik upotrebom izborničke trake. Izbornička traka izmjenjivat će različite menije omogućujući koriniku izbor željene akcije. Izmjena izbornika podrazumjeva da su izbornicima treba malo više strukturiranja od običnog prikaza u redu. QML koristi modele i predloške za pregled strukturiranih podataka.

Upotreba podatkovnih modela i predložaka

QML dolazi s različitim "podatkovim modelima&quot;:http://doc.qt.nokia.com/4.7/qdeclarativemodels.htm i predlošcima za prikaz istih. Naša izbornička traka prikazivati će izbornike u listi, sa zaglavljem u kojem će se nalaziti nazivi redova. Lista izbornika deklarira se unutar "VisualItemModel&quot;:http://doc.qt.nokia.com/4.7/qml-visualitemmodel.html elementa. "VisualItemModel&quot;:http://doc.qt.nokia.com/4.7/qml-visualitemmodel.html element sadrži elemente koji u sebi već sadrže <code&gt;Rectangle&lt;/code&gt; elemente kao i UI elemente koje smo uvezi. Druge tipove modele kao što je "ListModel&quot;:http://doc.qt.nokia.com/4.7/qml-listmodel.html moraju koristiti delegate da bi prikazali svoje podatke.

Deklariramo dva vizualna elementa unutar <code&gt;menuListModel&lt;/code&gt;, <code&gt;FileMenu&lt;/code&gt; i <code&gt;EditMenu&lt;/code&gt;. Prilagođujemo dva menija i prikazujemo ih upotrebom <code&gt;ListView&lt;/code&gt;. <code&gt;MenuBar.qml&lt;/code&gt; datoteka sadrži QML deklaracije a <code&gt;EditMenu.qml&lt;/code&gt; swadrži jednostavni <code&gt;Edit&lt;/code&gt; izbornik.

VisualItemModel {<br /> id: menuListModel<br /> FileMenu{<br /> width: menuListView.width<br /> height: menuBar.height<br /> color: fileColor<br /> }<br /> EditMenu{<br /> color: editColor<br /> width: menuListView.width<br /> height: menuBar.height<br /> }<br />}<br />

"ListView&quot;:http://doc.qt.nokia.com/4.7/qml-listview.html element prikazuje model prema delegatu. Delagat mode deklarirati da se elementi modela prikazuju unutar <code&gt;Row&lt;/code&gt; elementa ili da ih se prikaže unutar mrežnog prikaza. Naš <code&gt;menuListModel&lt;/code&gt; već ima vidljive elemente te nije potrebno deklarirati delegata.

ListView {<br /> id: menuListView

//Anchors are set to react to window anchors<br /> anchors.fill:parent<br /> anchors.bottom: parent.bottom<br /> width:parent.width<br /> height: parent.height

//the model contains the data<br /> model: menuListModel

//control the movement of the menu switching<br /> snapMode: ListView.SnapOneItem<br /> orientation: ListView.Horizontal<br /> boundsBehavior: Flickable.StopAtBounds<br /> flickDeceleration: 5000<br /> highlightFollowsCurrentItem: true<br /> highlightMoveDuration:240<br /> highlightRangeMode: ListView.StrictlyEnforceRange<br />}<br />

U to <code&gt;ListView&lt;/code&gt; nasljeđuje <code&gt;Flickable&lt;/code&gt; i time reagira na pomake miša. Zasdnji dio koda iznad postavlja <code&gt;Flickable&lt;/code&gt; svojstva da reagiraju na pokrete unutar našeg programa. PReciznije, svojstvo <code&gt;highlightMoveDuration&lt;/code&gt; određuje vrijeme izmjene između dva izbornika. Veća vrijednost, <code&gt;highlightMoveDuration&lt;/code&gt; uzrokovat će sporiju izmjenu izbornika.

<code&gt;ListView&lt;/code&gt; sadržava sve elemente po indeksima i svaki vizualni element je dostupan po tom indeksu, soritano po redu deklaracije. Izmjena <code&gt;currentIndex&lt;/code&gt; izmjenjuje označeni element unutar <code&gt;ListView&lt;/code&gt; elementa. Ovaj efekt dobvro je vidljiv na zaglavlju našeg izbornika. U redu se nalaze dva dugmeta koji kad se kliken na njih mijenjaju trenutno odabrani izbornik. Dugme <code&gt;fileButton&lt;/code&gt; izmijenit će trenbutno odabrani izbornik na <code&gt;File&lt;/code&gt; izbornik, s indeksom 0 pošto je <code&gt;FileMenu&lt;/code&gt; prvi deklariran unutar <code&gt;menuListModel&lt;/code&gt; elementa. Slično tome, <code&gt;editButton&lt;/code&gt; će promijeniti trenutni izbornik na <code&gt;EditMenu&lt;/code&gt;.

<code&gt;Rectangle&lt;/code&gt; objekt <code&gt;labelList&lt;/code&gt; imna svojstvo <i&gt;z&lt;/i&gt; postavljenmo na 1, što znači da će biti prikazan ispred izborničke trake. ELementi s nižom <i&gt;z&lt;/i&gt; vrijednosti bit će prikazane ispred elementa s višom <i&gt;z&lt;/i&gt; vrijednoti. Osnovna vrijednost <i&gt;z&lt;/i&gt; je 0.

Rectangle{<br /> id: labelList<br /> <br /> z: 1<br /> Row{<br /> anchors.centerIn: parent<br /> spacing:40<br /> Button{<br /> label: &quot;File&amp;quot;<br /> id: fileButton<br /> <br /> onButtonClick: menuListView.currentIndex = 0<br /> }<br /> Button{<br /> id: editButton<br /> label: &quot;Edit&amp;quot;<br /> <br /> onButtonClick: menuListView.currentIndex = 1<br /> }<br /> }<br />}<br />

The menu bar we just created can be flicked to access the menus or by clicking on the menu names at the top. Switching menu screens feel intuitive and responsive.
Izbornička traka koju smo upravo kreirali može biti manipulirana da bi se izbornicima pristupalo klikajući po nazivu izbornika na vrhu. Izmjena izborničkih ekrana djeluje intuitivno i ima brzi odaziv.

p=. http://doc.qt.nokia.com/4.7/images/qml-texteditor2_menubar.png

Izrada Text Editora

Deklaracija Text Area

Naš Tekst editor ne bi bio tekst editor a da nema u sebi površinu na kojoj možemo raditi izmjene na tekstu. QML ima "TextEdit&quot;:http://doc.qt.nokia.com/4.7/qml-textedit.html element koji omogućuje deklaraciju područja za prikaz i izmjene teksta. "TextEdit&quot;:http://doc.qt.nokia.com/4.7/qml-textedit.html se razlikuje od običnog "Text&quot;:http://doc.qt.nokia.com/4.7/qml-text.html koji nema mogućnost izmjene teksta.


TextEdit{
id: textEditor
anchors.fill:parent
width:parent.width; height:parent.height
color:"midnightblue&quot;
focus: true

wrapMode: TextEdit.Wrap

onCursorRectangleChanged: flickArea.ensureVisible(cursorRectangle)
}