31.05.2013 Views

Introduzione a Qt Quick™ - sereno-labs

Introduzione a Qt Quick™ - sereno-labs

Introduzione a Qt Quick™ - sereno-labs

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Edizione BETA<br />

INTRODUZIONE A QT QUICK<br />

2011 | Paolo Sereno<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 1


<strong>Introduzione</strong><br />

a<br />

<strong>Qt</strong> Quick<br />

Edizione BETA<br />

Paolo Sereno<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 2


EDIZIONE BETA: Giugno 2011<br />

Nokia, <strong>Qt</strong>, <strong>Qt</strong> Quick ed i rispettivi loghi sono marchi registrati di<br />

Nokia Corporation in Finlandia e resto del mondo.<br />

L’immagine di copertina è una mia creazione, ottenuta mediante un<br />

software di computer graphics.<br />

Questo document è rilasciato con licenza Creative Commons<br />

Attribution-Share Alike 3.0.<br />

Per ulteriori informazioni potete trovare a questo indirizzo i<br />

termini della licenza:<br />

http://creativecommons.org/licenses/by-sa/3.0/legalcode<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 3


Indice<br />

Prefazione ................................................................................................................................................................ 6<br />

Cosa è <strong>Qt</strong> Quick ..................................................................................................................................................... 7<br />

Breve storia .............................................................................................................................................................. 8<br />

A cosa serve ........................................................................................................................................................... 11<br />

Procurarsi <strong>Qt</strong> Quick ............................................................................................................................................. 12<br />

Installazione MS Windows ............................................................................................................................. 12<br />

Una prima occhiata a <strong>Qt</strong> Creator ....................................................................................................................... 21<br />

QML ................................................................................................................................................................... 25<br />

Un minimo di sintassi ...................................................................................................................................... 27<br />

Elementi base ........................................................................................................................................................ 28<br />

Rettangoli........................................................................................................................................................... 28<br />

Colori ................................................................................................................................................................. 33<br />

Gradienti di colore ....................................................................................................................................... 36<br />

Immagini ............................................................................................................................................................ 39<br />

Trattamento delle immagini ....................................................................................................................... 41<br />

Testo................................................................................................................................................................... 43<br />

Input Testuali .................................................................................................................................................... 45<br />

Comporre gli elementi di base ............................................................................................................................ 46<br />

Anchors ............................................................................................................................................................. 47<br />

Margins .............................................................................................................................................................. 51<br />

Interazione utente ................................................................................................................................................. 54<br />

Mouse ................................................................................................................................................................. 54<br />

MouseArea .................................................................................................................................................... 54<br />

Mouse Hover ................................................................................................................................................ 58<br />

Tastiera ............................................................................................................................................................... 60<br />

Esercizio ............................................................................................................................................................ 63<br />

Animazioni ............................................................................................................................................................. 64<br />

NumberAnimation ........................................................................................................................................... 65<br />

PropertyAnimation .......................................................................................................................................... 67<br />

Easing Curve ................................................................................................................................................ 69<br />

ColorAnimation ................................................................................................................................................ 71<br />

RotationAnimation .......................................................................................................................................... 73<br />

Gruppi di animazioni ....................................................................................................................................... 76<br />

SequentialAnimation ................................................................................................................................... 76<br />

ParallelAnimation ........................................................................................................................................ 78<br />

PauseAnimation................................................................................................................................................ 79<br />

Stati e Transizioni ................................................................................................................................................. 79<br />

Custom Items ........................................................................................................................................................ 83<br />

Definire un Custom Item ................................................................................................................................ 83<br />

Usare un Custom Item .................................................................................................................................... 84<br />

Proprietà di un Custom Item.......................................................................................................................... 85<br />

Signals&Slots ......................................................................................................................................................... 88<br />

Segnali di un Custom Item.............................................................................................................................. 91<br />

Conclusione ........................................................................................................................................................... 92<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 4


Presentazione dell’edizione “beta”<br />

La decisione di rilasciare una versione beta di questo libro, nasce<br />

dall’esigenza di condividerne i contenuti sin dalle fasi iniziali della<br />

sua stesura. In questo modo, tutti i lettori possono contribuire<br />

lanciando idee o chiedendo approfondimenti circa gli aspetti ritenuti<br />

più interessanti e partecipare così alla realizzazione di un libro<br />

chiaro e completo su questo nuovo ambiente open source per la<br />

creazione di applicazioni software per smartphone, dispositivi<br />

embedded e desktop.<br />

Per inviare commenti, richieste o chiarimenti, potete lasciarmi un<br />

feedback sulla pagina “contatti” del mio blog:<br />

http://www.<strong>sereno</strong>-<strong>labs</strong>.com/contact<br />

Oppure è anche possibile iscriversi al forum della community che ho<br />

fondato alcuni anni or sono:<br />

http://www.qt-italia.org/forum/<br />

Su questo forum, sarà possibile scambiare pareri, dubbi ed opinioni<br />

con i circa 450 iscritti (in continuo aumento) che frequentato la<br />

community.<br />

Approfitto inoltre di questa occasione per comunicare che da<br />

qualche tempo ho iniziato a presentare alcuni miei talk su <strong>Qt</strong>, <strong>Qt</strong><br />

Quick e le tecniche per la realizzazione di GUI evolute, durante gli<br />

eventi “open source” organizzati dai diversi Linux User Group in<br />

Italia; chi è interessato ad organizzare una mia partecipazione a<br />

questi eventi mi può mandare un messaggio all’indirizzo sopra.<br />

paolo<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 5


PREFAZIONE<br />

Da diversi anni i cultori del movimento open source e coloro che per<br />

professione o per passione scrivono applicazioni per PC, cellulari e<br />

tablet seguono le vicende dell’ambiente di sviluppo software<br />

gratuito ed open source <strong>Qt</strong> ( http://qt.nokia.com/).<br />

Nato originariamente come insieme di librerie di sviluppo software<br />

multipiattaforma, ovvero insieme di funzioni software disponibili per<br />

i più comuni sistemi operativi, da alcuni anni il <strong>Qt</strong> Application<br />

Framework è diventato l’ambiente di lavoro di riferimento per tutti<br />

coloro che scrivono applicazioni di interfaccia grafica (e non solo).<br />

A partire dal 2010 si è affermato un nuovo modo di scrivere<br />

applicazioni multimediali con <strong>Qt</strong>, l’introduzione di <strong>Qt</strong> Quick ha<br />

permesso infatti di estendere l’ecosistema di sviluppatori software<br />

anche a chi non ha particolari competenze di programmazione,<br />

metodologie object oriented e sviluppo software. Con <strong>Qt</strong> Quick è<br />

sufficiente imparare un numero limitato di regole e grazie alla<br />

disponibilità di strumenti informatici di ausilio alla creazione di<br />

programmi, chiunque può dar sfogo alla propria creatività e scrivere<br />

applicazioni di effetto. E’ sufficiente un computer di medie<br />

prestazioni su cui installare gratuitamente l’insieme degli strumenti<br />

necessari e la voglia di mettersi in gioco (o mettersi a giocare).<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 6


COSA È QT QUICK<br />

E’ parte del <strong>Qt</strong> Application framework di Nokia ed è un insieme di<br />

strumenti per la realizzazione rapida (da cui il nome Quick) di<br />

applicazioni multimediali multipiattaforma.<br />

<strong>Qt</strong> Quick è composto da:<br />

Un linguaggio (QML)<br />

Una piattaforma di supporto allo sviluppo (<strong>Qt</strong> application<br />

framework)<br />

Un ambiente di sviluppo (<strong>Qt</strong> Creator)<br />

<strong>Qt</strong> Quick è disponibile gratuitamente sul sito Nokia e può essere<br />

usato da chiunque per scrivere applicazioni per PC, telefonini, tablet<br />

e dispositivi embedded. La particolare licenza di <strong>Qt</strong> Quick (GPL v3,<br />

LGPL v2) lo rende uno strumento aperto per lo sviluppo di qualsiasi<br />

applicazione evoluta senza la necessità di conoscere linguaggi di<br />

programmazione e i molti dettagli tipici dello sviluppo software.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 7


BREVE STORIA<br />

Il toolkit <strong>Qt</strong> fu inizialmente sviluppato dai fondatori della Trolltech,<br />

Haavard Nord ed Eirik Chambe Eng. Lo sviluppo di un toolkit in<br />

C++ per la realizzazione di Graphical User Interface (GUI) iniziò nel<br />

1988, per conto di un'azienda svedese, che commissionò il lavoro ai<br />

due ricercatori e due anni più tardi, venne completato lo sviluppo di<br />

un'applicazione per la gestione di una banca dati di immagini,<br />

ottenute da apparecchiature mediche ad ultrasuoni; poiché questa<br />

applicazione doveva permettere l'esecuzione dell'interfaccia utente<br />

su sistemi MS Windows, Mac e UNIX, gettò le basi di quello che<br />

oggi è uno dei punti di forza di <strong>Qt</strong>: la portabilità del codice sorgente<br />

su diverse piattaforme o, come si dice correntemente, lo sviluppo<br />

“cross-platform”.<br />

Nel 1991 si iniziò a scrivere le prime classi di <strong>Qt</strong> a seguito dell'idea<br />

di implementazione del meccanismo di Signals&Slots, un semplice<br />

ma potente modo per far comunicare tra loro le classi del toolkit.<br />

Nel 1993, dopo aver trascorso due anni a lavorare sul progetto<br />

senza contratti e senza stipendio, Haavard ed Eirik resero<br />

disponibile il primo kernel grafico e decisero di entrare in affari<br />

presentando al mondo “il miglior GUI toolkit in C++<br />

multipiattaforma”.<br />

Il 1994 non iniziò nel migliore dei modi e si dovette attendere sino<br />

ad aprile 1995 per avere il primo contratto; il nome <strong>Qt</strong> venne scelto<br />

perché la lettera 'Q', tra i caratteri disponibili su Emacs, piaceva ad<br />

Haavard e la lettera 't' venne aggiunta per rappresentare la parola<br />

inglese “toolkit” (letteralmente l'insieme di strumenti di lavoro).<br />

Il 20 maggio venne rilasciata la versione 0.90 del toolkit e resa<br />

disponibile su sunsite.unc.edu, sei giorni dopo venne annunciata sul<br />

newsgroup comp.os.linux.announce.<br />

Questa fu la prima release pubblica di <strong>Qt</strong>, essa poteva essere usata<br />

sia per lo sviluppo di interfacce grafiche per MS Windows, sia per<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 8


Linux ed offriva le stesse API su entrambe le piattaforme. <strong>Qt</strong> fu<br />

reso disponibile secondo due licenze d'uso sin dal primo giorno: la<br />

licenza commerciale serviva per lo sviluppo di applicazioni<br />

commerciali o “close source” e la free software edition per lo<br />

sviluppo di applicazioni open source.<br />

Nel marzo 1996, l'agenzia spaziale europea (ESA) divenne il<br />

secondo cliente della Trolltech e da questo momento iniziò un<br />

periodo che portò in breve tempo al rilascio della versione 0.97<br />

(maggio), della versione 1.0 (settembre) e prima della fine<br />

dell'anno si giunse alla versione 1.1 usata da otto diversi clienti.<br />

Nell'aprile 1997 il fondatore del progetto KDE, Mattias Ettrich decise<br />

di adottare <strong>Qt</strong> per il suo progetto e, con il rilascio della versione<br />

1.2, il toolkit <strong>Qt</strong> divenne lo standard “de facto” per la realizzazione<br />

di GUI in C++ per Linux.<br />

Nel 1998, Mattias decise di entrare a far parte del team di<br />

sviluppatori Trolltech e contribuì al rilascio della versione 2.0.<br />

Questa versione conteneva un gran numero di cambi<br />

nell'architettura e rappresentò un notevole balzo in avanti nella<br />

realizzazione di un toolkit stabile e maturo; vennero aggiunte<br />

quaranta nuove classi, tra cui il supporto per l'UNICODE e<br />

nell'agosto del 1999 vinse il LinuxWorld award come miglior libreria<br />

software.<br />

L'anno 2000 segna l'ingresso sul mercato dell'ambiente<br />

<strong>Qt</strong>/embedded, concepito appositamente per supportare la<br />

piattaforma Linux/embedded. In quell'anno, Trolltech decise di<br />

cambiare la sua politica di licenza da QPL (politica open source<br />

appositamente redatta dalla Trolltech) a favore della ben più nota<br />

ed accettata GPL. Questo cambiamento venne accolto con<br />

entusiasmo dalle comunità open source (KDE per prima) di tutto il<br />

mondo.<br />

Il nuovo attesissimo balzo in avanti avvenne nel 2001 con il rilascio<br />

della versione 3.0. <strong>Qt</strong> era ora disponibile per MS Windows, UNIX,<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 9


Linux, Embedded Linux e Mac OS X. <strong>Qt</strong> 3.0 aggiunse quarantadue<br />

nuove classi e il codice superò le 500.000 linee.<br />

Dal 2001 al 2005 si è passati attraverso diverse releases che hanno<br />

fatto del toolkit <strong>Qt</strong> un mito tra gli sviluppatori (open source e non)<br />

di tutto il mondo, sia per le eccellenti caratteristiche tecniche del<br />

prodotto, sia per la politica di rilascio del prodotto aperta e<br />

lungimirante<br />

Nel 2008 Nokia acquista Trolltech e rilascia <strong>Qt</strong> sotto LGPL. Al<br />

momento della stesura di questo libro la release di <strong>Qt</strong> è la 4.7.3.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 10


A COSA SERVE<br />

<strong>Qt</strong> Quick è un ambiente di sviluppo molto semplice che non richiede<br />

particolare esperienza di programmazione e che può essere usato<br />

per scrivere applicazioni per telefonini, tablet e qualsiasi dispositivo<br />

embedded compatibile con l’application framework <strong>Qt</strong> di Nokia. <strong>Qt</strong><br />

Quick non richiede l’uso di compilatori perchè un linguaggio basato<br />

su JavaScript e quindi viene interpretato dalla macchina sui cui<br />

viene eseguito.<br />

Il suo scopo è quindi quello di permettere a chiunque di cimentarsi<br />

nella realizzazione di applicazioni grafiche (giochi, strumenti di<br />

social network, gestione dei dati personali etc...) in breve tempo e<br />

con poca fatica.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 11


PROCURARSI QT QUICK<br />

Come scritto in precedenza <strong>Qt</strong> Quick è uno strumento gratuito,<br />

messo a disposizione da Nokia con l’intento di creare un ecosistema<br />

di programmatori in grado di scrivere applicazioni per i propri<br />

cellulari (ma non solo cellulari) ed aumentare la massa critica dei<br />

suoi utenti per proteggere il mercato da famosi concorrenti.<br />

INSTALLAZIONE MS WINDOWS<br />

Per procurarsi <strong>Qt</strong> Quick occorre per prima cosa collegarsi a questo<br />

indirizzo:<br />

http://qt.nokia.com/qtquick/<br />

e scaricare il seguente file (corrispondente alla versione <strong>Qt</strong> SDK 1.1<br />

al momento della stesura di questo libro):<br />

http://get.qt.nokia.com/qtsdk/<strong>Qt</strong>_SDK_Windows_online_v1_1_en.exe<br />

Dopo aver scaricato il file di installazione, eseguirlo mediante<br />

doppio click del mouse da file explorer.<br />

La prima finestra che ci verrà proposta sarà:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 12


Premiamo Next ed avremo:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 13


Se vogliamo installare <strong>Qt</strong> nella cartella C:\<strong>Qt</strong>SDK possiamo<br />

mantenere l’impostazione predefinita, altrimenti cambieremo il path<br />

in base alla nostra preferenza.<br />

Lasciamo tutte le altre impostazioni invariate, avremo quindi il<br />

check sulla installazione di Default (l’opzione Custom è per utenti<br />

esperti) e non andremo ad attivare il comando di Remove old <strong>Qt</strong><br />

Creator settings. A questo punto premiamo Next.<br />

Per poter utilizzare <strong>Qt</strong> è necessario leggere ed accettare la licenza<br />

proposta.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 14


A questo punto possiamo premere Next.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 15


Possiamo lasciare <strong>Qt</strong> SDK come shortcut nel nostro menu di avvio<br />

delle applicazioni e premere quindi nuovamente Next.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 16


E finalmente possiamo avviare l’installazione.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 17


L’operazione di installazione richiederà un certo tempo, al termine<br />

del quale verrà presentata la finestra seguente:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 18


Premiamo ora Next.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 19


A questo punto il nostro ambiente di lavoro è pronto per l’uso.<br />

Proviamo ora a fare pratica con l’ambiente di sviluppo, ovvero <strong>Qt</strong><br />

Creator.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 20


UNA PRIMA OCCHIATA A QT CREATOR<br />

<strong>Qt</strong> Creator è l’ambiente di sviluppo integrato di Nokia per sviluppare<br />

applicazioni <strong>Qt</strong> Quick in modo rapido e semplice.<br />

Lanciamo <strong>Qt</strong> Creator dal menu start:<br />

La finestra principale di <strong>Qt</strong> Creatorè così composta:<br />

Sulla sinistra è visibile la toolbar delle modalità di funzionamento:<br />

Welcome: modalità introduttiva. E’ possibile creare un<br />

progetto,aprirne uno esistente o richiamare progetti di esempio per<br />

<strong>Qt</strong> e <strong>Qt</strong> Quick<br />

Edit: modalità editor di testo<br />

Design: modalità per il design grafico dell’interfaccia utente<br />

Debug: modalità di debug dell’applicazione<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 21


Projects: modalità di impostazioni del progetto corrente<br />

Help: modalità per la visualizzazione della documentazione in linea.<br />

Sulla stessa toolbar, nella parte inferiore trovano posto i comandi<br />

di Build, Run e Debug<br />

La parte inferiore della finestra riporta invece un controllo di input<br />

per le operazioni di ricerca e successivamente quattro pulsanti di<br />

comando per la visualizzazione degli output nei seguenti contesti:<br />

Build Issues: messaggi di output a seguito di problemi nelle<br />

operazioni di Build dell’applicazione<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 22


Search Result: selezionando questo comando si possono<br />

visualizzare i risultati dell’ultima ricerca<br />

Application Output: visualizzazione degli output da console<br />

dell’applicazione in esecuzione<br />

Compile Output: messaggi di errore nella fase di compilazione dei<br />

sorgenti C++<br />

Prima di procedere con la presentazione del linguaggio QML,<br />

proviamo a lanciare un esempio tra quelli forniti con il l’ambiente <strong>Qt</strong><br />

SDK.<br />

In modalità Welcome, selezioniamo gli esempi di <strong>Qt</strong> Quick e fra essi<br />

QML UI Components. L’esempio che andremo a selezionare è<br />

“Flipable”, come visibile in figura seguente.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 23


Dopo aver selezionato l’esempio, il progetto Flipable verrà aperto.<br />

Premiamo ora la combinazione di tasti CTRL+R, corrispondente al<br />

comando di Run o in alternativa facciamo click sul comando run.<br />

In breve tempo comparirà sul nostro monitor la finestra<br />

dell’applicazione flipable:<br />

Per comprendere il funzionamento dell’esempio proviamo a fare<br />

click su una qualsiasi delle due carte da gioco presenti nella<br />

finestra; verrà proposta un’animazione interamente realizzata con<br />

<strong>Qt</strong> Quick mediante il linguaggio QML.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 24


QML<br />

QML è un linguaggio dichiarativo per elementi di interfaccia utente,<br />

esso cioè descrive di quali elementi si compone l’interfaccia, come<br />

sono costruiti questi elementi e come si comportano in reazione agli<br />

eventi generati dall’utente (pressioni sul display touchscreen etc...).<br />

Una qualsiasi interfaccia utente realizzata con QML può essere<br />

schematizzata come una gerarchia ad albero di tutti gli elementi di<br />

interfaccia caratterizzati da proprietà peculiari.<br />

Rectangle<br />

Text Image<br />

Che si traduce in questa struttura della nostra applicazione<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 25


Rectangle<br />

(proprietà: dimensioni, colore...)<br />

Text<br />

(proprietà: font, colore, dimensioni)<br />

Image<br />

(proprietà: posizione, file immagine)<br />

Che fornirà sul display del nostro telefonino o tablet o dispositivo<br />

compatibile un’interfaccia molto semplice di questo tipo:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 26


UN MINIMO DI SINTASSI<br />

Prima di iniziare a scrivere i nostri primi programmi con <strong>Qt</strong> Quick,<br />

dobbiamo sapere che occorre rispettare un minimo numero di<br />

regole peer rispettare la sintassi del linguaggio QML.<br />

Per ora ci basti sapere che un qualsiasi elemento di <strong>Qt</strong> Quick è<br />

composto dal suo identificativo e poi da un corpo contenente le sue<br />

proprietà. In altre parole<br />

Elemento {<br />

....<br />

}<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 27


ELEMENTI BASE<br />

RETTANGOLI<br />

Gli elementi di interfaccia utente basilari del linguaggio QML, il<br />

linguaggio di programmazione impiegato da <strong>Qt</strong> Quick sono molto<br />

semplici:<br />

Rettangoli<br />

Colori<br />

Immagini<br />

Testo<br />

Mediante questi semplici elementi è già possibile realizzare alcuni<br />

programmi di esempio per capire come funziona <strong>Qt</strong> Quick.<br />

Iniziamo con il nostro primo esempio. Apriamo un nuovo file con <strong>Qt</strong><br />

Creator ed avremo ad esempio il nostro primo file “prova.qml”<br />

Per prima cosa occorre importare l’ambiente <strong>Qt</strong> Quick mediante<br />

l’istruzione seguente:<br />

import <strong>Qt</strong>Quick 1.0<br />

grazie a questa istruzione, <strong>Qt</strong> Creator è ora in grado di riconoscere<br />

la sintassi del programma che andiamo a scrivere ed impiegare le<br />

interfacce di programmazione (API) necessarie. Il fatto di<br />

specificare una versione di <strong>Qt</strong> Quick consente di ottenere le<br />

funzionalità desiderate e garantire che il comportamento<br />

dell’applicazione che stiamo scrivendo non cambi.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 28


Scriviamo ora il nostro primo rettangolo:<br />

Rectangle {<br />

width: 640; height:480<br />

color: "green"<br />

}<br />

Proviamo ora ad eseguire questo primo esempio e premiamo il<br />

tasto (triangolo verde) sulla destra in basso del nostro monitor. <strong>Qt</strong><br />

Creator inizierà ad eseguire il codice che abbiamo scritto e ci<br />

presenterà questa finestra a video:<br />

Come possiamo osservare, è stata creata una finestra di colore<br />

verde. Questa finestra contiene il nostro rettangolo di 640x480<br />

pixel di colore verde.<br />

Una proprietà interessante dei rettangoli di <strong>Qt</strong> Quick è data dalla<br />

possibilità di eseguire degli annidamenti, in tal modo si possono<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 29


combinare elementi uno all’interno dell’altro. Per capire il concetto<br />

di annidamento di elementi modifichiamo il nostro programma nel<br />

modo seguente:<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle {<br />

width: 640; height:480<br />

color: "green"<br />

}<br />

Rectangle {<br />

color: "red"<br />

width : 320; height: 240<br />

x: 160; y:120<br />

}<br />

A questo punto premendo il tasto di esecuzione programmi<br />

(triangolo verde) avremo la finestra di figura seguente:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 30


Come si può osservare, l’annidamento del secondo rettangolo<br />

all’interno del corpo di istruzioni del primo ha generato<br />

graficamente un secondo rettangolo (di colore rosso) all’interno del<br />

nostro primo rettangolo di colore verde.<br />

Infatti, il secondo elemento che abbiamo aggiunto al nostro<br />

programma è un rettangolo di colore rosso, di dimensioni 320x240<br />

(width: 320; height: 240) posizionato in un punto ben preciso<br />

all’interno del rettangolo contenitore; le coordinate di questo punto<br />

sono infatti x: 160; y: 120<br />

Rectangle {<br />

color: "red"<br />

width : 320; height: 240<br />

x: 160; y:120<br />

}<br />

Prima di proseguire occorre fare una precisazione sul sistema di<br />

coordinate usato da <strong>Qt</strong> Quick. Come abbiamo visto, specificando le<br />

proprietà del rettangolo rosso x: 160; y: 120, abbiamo eseguito un<br />

posizionamento del vertice “alto-sinistro” del rettangolo alle<br />

coordinate 160,120. Il sistema di coordinate a due dimensioni di <strong>Qt</strong><br />

Quick è il seguente:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 31


Ovvero il punto più alto è più a sinistra corrisponde all’origine del<br />

sistema di coordinate.<br />

Per comprendere meglio questo concetto proviamo a modificare il<br />

secondo rettangolo nel modo seguente:<br />

Rectangle {<br />

color: "red"<br />

width : 320; height: 240<br />

x: 0; y: 0<br />

}<br />

Premiamo ora il tasto di esecuzione ed avremo:<br />

Il nostro secondo rettangolo rosso che è stato posizionato alle<br />

coordinate X:0 e Y:0 ora si trova nella parte più in alto e a sinistra<br />

del rettangolo contenitore.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 32


COLORI<br />

Per gli esempi di paragrafo precedente abbiamo impiegato due<br />

rettangoli di colore rosso e verde. <strong>Qt</strong> Quick permette di definire i<br />

colori impiegando 3 differenti sintassi.<br />

Il metodo più diretto ed immediato consente di specificare i colori<br />

come valori testuali (stringhe) corrispondenti ai nomi dei colori<br />

nella lingua inglese (“red”, “green”, “blue”). Questo metodo,<br />

benchè semplice non consente di specificare una vasta gama di<br />

colori. I colori predefiniti sono infatti in numero limitato e sono<br />

riportati nella tabella seguente:<br />

<br />

Un modo più efficace per specificare i colori è rappresentato dall’uso<br />

di una terna di numeri corrispondenti ai livelli dei colori primari<br />

(rosso, verde e blu) che compongono il colore che si vuole ottenere.<br />

In tal caso la sintassi da impiegare è la seguente:<br />

#<br />

Dove rr, gg, bb sono valori esadecomali espressi su due digits.<br />

Avremo pertanto 256 possibili combinazioni (da 00 a FF) per ogni<br />

colore primario, per un totale di 2 ^24 ovvero (16.777.216)<br />

tonalità di colore.<br />

Un terzo modo per specificare i colori impiega una funzione messa a<br />

disposizione dall’ambiente di programmazione <strong>Qt</strong>, ovvero la<br />

funzione rgba che consente di specificare oltre ai livelli dei clori<br />

primari (r,g,b), anche il valore di opacità del colore stesso. I valori<br />

di opacità che possono essere espressi vanno dal valore 0.0<br />

(trasparente) al valore 1.0 (massima opacità).<br />

Per specificare un colore mediante la funzione rgba la sintassi è la<br />

seguente:<br />

<strong>Qt</strong>.rgba(r,g,b,a)<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 33


Alcuni esempi sono quindi<br />

<strong>Qt</strong>.rgba(0, 0, 0, 1) //colore nero con massima opacità<br />

Qr.rgba(0, 1, 0, 1) //colore verde con massima opacità<br />

Qr.rgba(0, 1, 0, 0.5) //colore rosso con opacità del 50%<br />

Proviamo ora a modificare il nostro secondo rettangolo in questo<br />

modo:<br />

Rectangle<br />

{<br />

color: <strong>Qt</strong>.rgba(1,0,0,0.5)<br />

width : 320; height: 240<br />

x: 0; y:0<br />

}<br />

E la nostra applicazione sarà<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 34


Proviamo ora ad eseguire una combinazione delle informazioni<br />

riportate in questo paragrafo scrivendo questo programma QML:<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "green"<br />

Rectangle<br />

{<br />

color: "red"<br />

width : 120; height: 240<br />

x: 140; y:120<br />

}<br />

Rectangle<br />

{<br />

color: "#00ff00"<br />

width : 120; height: 240<br />

x: 260; y:120<br />

}<br />

Rectangle<br />

{<br />

color: <strong>Qt</strong>.rgba(0,0,1,1)<br />

width : 120; height: 240<br />

x: 380; y:120<br />

}<br />

}<br />

Il risultato saranno 3 rettangoli affiancati, uno di coore rosso, uno<br />

di colore verde e uno di colore blu.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 35


GRADIENTI DI COLORE<br />

Uno degli effetti più interessanti per rendere gradevoli le interfacce<br />

utente è l’uso di gradienti di colore. I colori “solidi” come abbiamo<br />

visto a paragrafo precedente non si prestano per mimare effeti di<br />

ombreggiature o addirittura dare agli elementi dell’interfaccia un<br />

aspetto metallico, plastico o liquido. <strong>Qt</strong> Quick ci consente di<br />

specificare dei gradienti di colore per rendere più interessanti gli<br />

oggetti grafici delle nostre interfacce mediante una sintassi del<br />

linguaggio QML molto semplice.<br />

Riprendiamo il nostro esempio e questa volta usiamo un gradiente:<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

gradient: Gradient {<br />

GradientStop {<br />

position: 0.0; color: "blue"<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 36


}<br />

}<br />

}<br />

GradientStop {<br />

position: 1.0; color: "green"<br />

}<br />

Il risultano che otteniamo è il seguente:<br />

Mediante la sintassi<br />

gradient: Gradient {<br />

GradientStop {<br />

position: 0.0; color: "blue"<br />

}<br />

GradientStop {<br />

position: 1.0; color: "green"<br />

}<br />

}<br />

Specifichiamo quindi un gradiente lineare dal colore blu al colore<br />

verde.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 37


Un gradiente in <strong>Qt</strong> Quick è infatti costituito da un certo numero di<br />

punti (o position) in cui viene fissato un colore. Nel nostro caso,<br />

l’origine del gradiente è di colore blu (position: 0.0; color: "blue")<br />

e la fine del gradiente, corrispondente al valore di position 1.0 è di<br />

colore verde (position: 1.0; color: "green").<br />

Complichiamo ora l’esempio visto prima aggiungendo un ulteriore<br />

punto o posizione:<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

gradient: Gradient {<br />

GradientStop {<br />

position: 0.0; color: "gray"<br />

}<br />

GradientStop {<br />

position: 0.5; color: "white"<br />

}<br />

GradientStop {<br />

position: 1.0; color: "gray"<br />

}<br />

}<br />

}<br />

Abbiamo ora tre positioni<br />

GradientStop {<br />

position: 0.0; color: "gray"<br />

}<br />

GradientStop {<br />

position: 0.5; color: "white"<br />

}<br />

GradientStop {<br />

position: 1.0; color: "gray"<br />

}<br />

In origine il gradiente assume colore grigio (“gray”); al centro,<br />

ovvero in position : 0.5 assume il colore bianco (“white”) e al<br />

termine (position: 1.0) nuovamente il colore grigio. Il risultato di<br />

tale gradiente sarà:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 38


IMMAGINI<br />

Il caricamento delle immagini è una funzione molto semplice e<br />

potente di <strong>Qt</strong> Quick. Un’immagine può rappresentare lo sfondo di<br />

una nostra applicazione o un qualsiasi controllo grafico (pulsanti,<br />

barre di scorrimento etc...).<br />

Vediamo come caricare un’immagine in <strong>Qt</strong> Quick.<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

Image {<br />

x:270; y:225<br />

source: "image.png"<br />

}<br />

}<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 39


La sintassi QML per caricare un file immagine è:<br />

Image {<br />

}<br />

<br />

Nel nostro caso<br />

Image {<br />

x:270; y:225<br />

source: "image.png"<br />

}<br />

Abbiamo specificato una posizione dell’immagine all’interno del<br />

rettangolo contenitore mediante x:270; y:225 ed abbiamo indicato<br />

il file contenente l’immagine mediante source: "image.png".<br />

Come risultato otterremo la segunete finestra:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 40


TRATTAMENTO DELLE IMMAGINI<br />

<strong>Qt</strong> Quick consente di ridimensionare e ruotare le immagini.<br />

Ridimensionamento<br />

Per ridimensionare un’immagine è sufficiente definire un fattore di<br />

scala mediante la sintassi scale:.<br />

Nell’esempio sopra riportato avremo pertanto<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

Image {<br />

x:270; y:225<br />

source: "image.png"<br />

scale: 3.0<br />

}<br />

}<br />

Il cui risultato è visibile in figura seguente:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 41


Come si può osservare, la dimensione dell’immagine è<br />

notevolmente aumentata in consweguenze del fatto che è stato<br />

specificato un fattore di scala uguale a 3.0.<br />

Rotazione<br />

Per ruotare un’immagine è sufficiente definire un valore di rotazione<br />

espresso in gradi, mediante la sintassi rotation:.<br />

Il nostro esempio diventerà perciò:<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

Image {<br />

x:270; y:225<br />

source: "image.png"<br />

rotation: 45.0<br />

}<br />

}<br />

Il cui risultato è visibile in figura seguente:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 42


Come si può osservare, l’immagine risulta ruotata in senso orario di<br />

45 gradi.<br />

TESTO<br />

Un elemento molto importante di qualsiasi interfaccia utente è il<br />

testo. Il testo viene usato per visualizzare informazioni o per<br />

richiedere l’inserimento di dati. <strong>Qt</strong> Quick fornisce un semplice e<br />

potente meccanismo per la gestione del testo.<br />

La sintassi per specificare elementi di testo in <strong>Qt</strong> Quick è:<br />

Text {<br />

<br />

}<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 43


All’interno del corpo dell’elemento si trovano le proprietà che<br />

desideriamo impostare per il nostro testo. Ad esempio con la<br />

sintassi seguente<br />

}<br />

Text {<br />

x:320; y:240<br />

text: "testo"<br />

font.pointSize: 16<br />

Otterremo come risultato:<br />

Come si può immaginare, le possibilità di personalizzazione del<br />

testo sono molteplici con <strong>Qt</strong> Quick. Si va dalla possibilità di<br />

selezionare il font, la dimensione, il colore, l’allineamento del testo,<br />

lo stile.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 44


<strong>Qt</strong> Creator ci viene in aiuto ancora una volta presentandoci una<br />

dialog box ogni volta che posizioniamo il cursore all’interno di un<br />

elemento text.<br />

Tramite questa dialog box possiamo impostare tutte le opzioni del<br />

testo senza doverci ricordare a memoria tutte le opzioni.<br />

INPUT TESTUALI<br />

L’elemento TextInput rappresenta un semplice elemento di test<br />

editabile che ottiene il focus quando viene eseguito un click del<br />

mouse (o altro puntatore) su di esso.<br />

Anche in questo caso la sintassi è molto semplice:<br />

TextInput {<br />

<br />

}<br />

Un semplice esempio può essere:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 45


import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

TextInput {<br />

x:320; y:240; width: 200<br />

text: "editabile"<br />

}<br />

}<br />

Che produrrà il seguente risultato lanciando l’applicazione da <strong>Qt</strong><br />

Creator<br />

COMPORRE GLI ELEMENTI DI BASE<br />

Dopo la panoramica di paragrafo precedente sugli elementi base di<br />

un’interfaccia grafica con <strong>Qt</strong> Quick, occupiamoci ora di comporre<br />

questi elementi per realizzare la nostra applicazione.<br />

La composizione di elementi avviene mediante i meccanismi di<br />

layout imlementati e a cui possiamo accedere mediante gli Anchors.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 46


ANCHORS<br />

Gli anchors sono usati per posizionare ed allineare gli elementi<br />

dell’interfaccia utente. Un Anchors può riferirsi ad un altro elemento<br />

oppure ad un Anchor di un altro elemento.<br />

Proviamo ad esempio ad usare un anchors di un elemento di testo<br />

inserito in un rettangolo, più precisamente, usiamo un anchors.right<br />

e lo “ancoriamo” al lato destro del rettangolo contenitore (definito<br />

anche genitore) e cioè parent.right. Come nella porzione di<br />

programma QML seguente:<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

Text {<br />

y:240;<br />

text: "testo"<br />

font.pointSize: 20<br />

anchors.right: parent.right<br />

}<br />

}<br />

Il risultato che otterremo sarà:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 47


Come possiamo osservare, il nostro “testo” si trova in posizione<br />

destra più o meno a metà altezza (y: 240) del rettangolo genitore.<br />

Analogamente, l’istruzione anchors.left: parent.left sposterà il<br />

nostro “testo” sul lato destro del rettangolo contenitore (genitore).<br />

<strong>Qt</strong> Quick mette a disposizione un ampio numero di anchors che<br />

incontreremo nel resto di questo libro, essi consentiranno di<br />

ancorare un elemento in qualsiasi posizione secondo lo schema di<br />

principio seguente:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 48


Un’altro modo per posizionare un elemento è mediante la modalita<br />

di centerIn. In questo modo infatti chiediamo di ancorare un<br />

elemento grafico esattamente al centro di un altro elemento<br />

contenitore.<br />

Se consideriamo ad esempio questa porzione di programma QML<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

id: rectangle1<br />

Text {<br />

text: "testo"<br />

font.pointSize: 20<br />

anchors.centerIn: rectangle1<br />

}<br />

}<br />

Che darà come risultato:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 49


In questo caso, vediamo infatti che il testo risulta perfettamente<br />

centrato orizzontalmente e verticalmente all’internon del rettangolo<br />

bianco contenitore. Il meccanismo di centrIn di anchors ha infatti<br />

tenuto conto di tutte le grandezze in gioco, ovvere la lunghezza e<br />

l’altezza del testo per calcolarne la posizione iniziale all’interno del<br />

rettangolo contenitore.<br />

L’esempio sopra riportato ci ha introdotto una nuova caratteristica<br />

di QML, ovvero l’uso di identificatori (id) per referenziare gli<br />

elementi della nostra interfaccia utente.<br />

E’ stata infatti introdotta l’istruzione<br />

id: rectangle1<br />

all’interno dell’elemento rectangle. Da questo punto in poi del<br />

nostro programma QML, potremo identificare il rettangolo<br />

contenitore in un modo alternativo all’uso di parent, bensi<br />

chiamandolo per nome (rectangle1). Il suo id è stato infatti usato<br />

nell’istruzione<br />

anchors.centerIn: rectangle1<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 50


per ancorare il nostro elemento di Text (testo) al centro del<br />

rettangolo contenitore (rectangle1).<br />

Il meccanismo di id è una funzionalità molto importante di QML è<br />

consente di mettere in relazione gli elementi dell’applicazione<br />

grafica tra di loro.<br />

Nell’esempio sopra riportato si può constatare l’equivalenza delle<br />

due istruzioni<br />

anchors.centerIn: rectangle1<br />

anchors.centerIn: parent<br />

tuttavia non è sempre possibile in un’applicazione stabilire delle<br />

relazioni tra elemento genitore ed elemento figlio, si possono infatti<br />

presentare delle situazioni in cui le relazioni vanno stabilite tra<br />

elementi che non hanno una relazione parentale “verticale” ed in tal<br />

caso l’uso del meccanismo di id è l’unico modo per creare una<br />

relazione.<br />

MARGINS<br />

L’uso di Margins consente di aggiungere degli spazi specificando<br />

delle distanze in pixel o tramite elementi connessi tra loro con<br />

Anchors.<br />

In figura seguente viene riportano uno schema di principio per il<br />

meccanismo dei margini<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 51


Vediamo un semplice esempio.<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

Text {<br />

text: "testo"<br />

font.pointSize: 20<br />

anchors.left: parent.left<br />

anchors.leftMargin: parent.width/8<br />

anchors.verticalCenter: parent.verticalCenter<br />

}<br />

}<br />

Che verrà visualizzato con la seguente finestra:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 52


La porzione di codice più significativa è:<br />

anchors.left: parent.left<br />

anchors.leftMargin: parent.width/8<br />

anchors.verticalCenter: parent.verticalCenter<br />

La prima istruzione è già nota, ci permette di ancorare il nostro<br />

elemento di testo nella parte a sinistra all’interno del rettangolo<br />

contenitore. Con la seconda istruzione precisiamo al gestore di<br />

layout di <strong>Qt</strong> Quick che l’elemento di testo verrà posizionato con un<br />

margine a sinistra pari ad un ottavo dell’ampiezza del rettangolo<br />

contenitore e quindi non immediatamente al bordo sinistro e infine<br />

la terza e ultima istruzione posiziona verticalmente al centro del<br />

rettangolo contenitore il testo.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 53


INTERAZIONE UTENTE<br />

Realizzare un’applicazione dotata di interfaccia grafica significa<br />

consentire uno scambio di informazioni tra l’applicazione e l’utente.<br />

Il transito di queste informazioni è ovviamente bidirezionale,<br />

l’utente richiede all’applicazione l’esecuzione di compiti specifici<br />

mediante comandi di vario tipo e ne visualizza i risultati sul display.<br />

Per questa interazione è quindi fondamentale poter ricevere i<br />

comandi dell’utente mediante i più comuni dispositivi di input,<br />

ovvero mouse (o touchscreen) e tastiera.<br />

I tipi di input possibili sono fondamentalmente<br />

Eventi del mouse (movimenti, click, drag)<br />

Eventi di tastiera<br />

MOUSE<br />

MOUSEAREA<br />

<strong>Qt</strong> Quick permette l’interazione con il mouse mediante del “mouse<br />

area”, ovvero porzioni del display entro cui avvengono eventi di<br />

input provocati dal cursore. Vediamo un semplice esempio per<br />

comprendere il concetto di mouse area e di conseguenza come<br />

interagire con il mouse (o altro dispositivo di puntamento).<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

Text {<br />

text: "Premi qui"<br />

font.pointSize: 20<br />

anchors.horizontalCenter: parent.horizontalCenter<br />

anchors.verticalCenter: parent.verticalCenter<br />

}<br />

MouseArea {<br />

anchors.fill: parent<br />

onPressed: parent.color = "red"<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 54


}<br />

}<br />

onReleased: parent.color = "white"<br />

In questo semplice programma di esempio è stato introdotto un<br />

nuovo elemento: MouseArea.<br />

Anche MouseArea è contenuto nel rettangolo genitore ed in<br />

particolare mediante l’istruzione<br />

anchors.fill: parent<br />

andiamo a specificare che l’area sensibile agli eventi del mouse<br />

corrisponderà all’intera area del rettangolo genitore.<br />

L’istruzione seguente<br />

onPressed: parent.color = "red"<br />

rappresenta l’azione che vogliamo far compiere alla nostra<br />

applicazione quando viene premuto il pulsante sinistro del mouse (o<br />

viene premuto il touchscreen) nella MouseArea. In questo caso<br />

l’effetto sarà quello di far cambiare il colore del rettangolo<br />

contenitore. Infine, mediante l’istruzione<br />

onReleased: parent.color = "white"<br />

al successivo rilascio del pulsante, il colore del rettangolo tornerà a<br />

bianco.<br />

Il risultato di questo piccolo programma scritto in QML sarà quindi<br />

quello visibile in figura seguente.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 55


Lo sfondo di colore rosso della finestra indica appunto che è stato<br />

generato un evento di input (in questo caso è stato premuto il<br />

pulsante sinistro del mouse) nella MouseArea.<br />

Proviamo ora ad unire alcuni dei concetti esposti in questo capitolo<br />

nella seguente applicazione QML:<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

Text {<br />

text: "Premi qui"<br />

font.pointSize: 20<br />

anchors.horizontalCenter: parent.horizontalCenter<br />

anchors.verticalCenter: parent.verticalCenter<br />

id: testo<br />

}<br />

MouseArea {<br />

anchors.fill: testo<br />

onPressed: testo.color="red"<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 56


}<br />

}<br />

onReleased: testo.color="black"<br />

L’uso della id:testo ci permetterà di catturare gli eventi del mouse<br />

in corrispondenza dell’area di testo e tramite onPressed e<br />

onReleased andremo a cambiare il colore dell’elemento Text.<br />

<strong>Qt</strong> Quick consente di generare eventi sulla pressione del bottone<br />

sinistro del mouse, tuttavia è possibile cambiare il comportamento<br />

predefinito modificando la proprietà acceptedButtons. In<br />

particolare, qualora si volessero accettare gli eventi generati dalla<br />

pressione sia del pulsante sinisto, sia del pulsante destro si può<br />

impostare tale propprietà nel modo seguente:<br />

acceptedButtons: <strong>Qt</strong>.LeftButton | <strong>Qt</strong>.RightButton<br />

In questo modo, combinando mediante l’operatore logico OR ( | ) i<br />

due valori <strong>Qt</strong>.LeftButton e <strong>Qt</strong>.RightButton, la mouseArea<br />

corrispondente genererà eventi di onPressed e onReleased<br />

premendo un qualsiasi pulsante (destro o sinistro) del mouse.<br />

Per accettare invece eventi solamente dal pulsante destro sarà<br />

sufficiente scrivere:<br />

acceptedButtons: <strong>Qt</strong>.RightButton<br />

Per consentire all’applicazione di esempio, riportata in precedenza,<br />

di interagire con entrambi i pulsanti del mouse sullaMouseArea<br />

definita dovremo perciò scrivere:<br />

MouseArea {<br />

acceptedButtons: <strong>Qt</strong>.LeftButton | <strong>Qt</strong>.RightButton<br />

anchors.fill: testo<br />

onPressed: testo.color="red"<br />

onReleased: testo.color="black"<br />

}<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 57


MOUSE HOVER<br />

Una MouseArea può generare altri eventi di input oltre a quelli già<br />

visti in precedenza onPressed e onReleased, in particolare essa può<br />

generare eventi ogni volta che il cursore passa sull’area stessa; in<br />

questo caso si parla di eventi di mouse hover.<br />

Riprendendo l’esempio precedente proviamo ora ad aggiungere una<br />

nuova funzione al nostro testo: quando il cursore del mouse verrà<br />

osizionato sopra l’area corrispondente al testo stesso, esso dovrà<br />

assumere il colre verde, per poi tornare di colore nero quando il<br />

cursore lascerà l’area.<br />

In QML l’applicazione sarà:<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

Text {<br />

text: "Premi qui"<br />

font.pointSize: 20<br />

anchors.horizontalCenter: parent.horizontalCenter<br />

anchors.verticalCenter: parent.verticalCenter<br />

color: mouse_area.containsMouse ? "green" :<br />

"black"<br />

id: testo<br />

}<br />

MouseArea {<br />

id: mouse_area<br />

acceptedButtons: <strong>Qt</strong>.LeftButton|<strong>Qt</strong>.RightButton<br />

anchors.fill: testo<br />

hoverEnabled: true<br />

}<br />

}<br />

Le istruzioni utili per realizzare questa nuova funzione sono<br />

color: mouse_area.containsMouse ? "green" : "black"<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 58


nel corpo dell’elemento Text e l’istruzione:<br />

hoverEnabled: true<br />

nel corpo della MouseArea.<br />

Come è facile intuire, impostare la proprietà hoverEnabled al valore<br />

booleano true equivale ad abilitare la funzionalità di Mouse Hover,<br />

per cui quando il cursore verrà posizionato in corrispondenza del<br />

testo, <strong>Qt</strong> quick genererà un evento all’elemento Text.<br />

L’istruzione più interessante, per il nostro scopo, è invece la prima<br />

in quanto impiega un operatore di confronto<br />

(mouse_area.containsMouse ?) per attribuire un colore verde o<br />

nero.<br />

Occorre per prima cosa osservare che mouse_area è l’identificativo<br />

della MouseArea creata in precedenza. Nel suo corpo infatti è stato<br />

inserita l’istruzione id: mouse_area che ci consentirà di fare<br />

riferimento ad essa con il suo nome. L’uso di<br />

mouse_area.containsMouse non è altro che un modo per leggerne<br />

la proprietà (containsMouse appunto) e in caso affermativo<br />

andremo ad impostare il colore verde (“green”) per il testo o<br />

alternativamente nero (“black”). L’uso dell’operatore “?”, ben noto<br />

a chi conosce i linguaggi C e C++, non è altro che un modo per<br />

eseguire un’operazione di confronto (if). Nel caso l’argomento posto<br />

prima del “?” sia di valore vero (in termini di logica booleana =<br />

true) verrà restituito il valore a sinistra del “:”, in caso negativo<br />

verrà restituito il valore a destra.<br />

Nel caso in oggetto, quando il cursore è posizionato all’interno della<br />

MouseArea (ovvero mouse_area.containsMouse è true), alla<br />

proprietà color verrà assegnato “green”, in caso contrario verrà<br />

assegnato “black”.<br />

Il risultato, nel caso di cursore posizionato sul testo “Premi qui”<br />

sarà quindi quello di figura seguente:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 59


TASTIERA<br />

La tastiera rappresenta quel dispositivo di input vitale per inserire<br />

qualsiasi tipo di dato alfanumerico. <strong>Qt</strong> Quick accetta input da<br />

tastiera mediante gli elementi TextInput (già incontrato in un<br />

precedente esempio del libro) e TextEdit, oltre a ciò, la tastiera<br />

rappresenta uno strumento utile per la navigazione tra gli elementi<br />

(si pensi ai tasti freccia ad esempio) in cui si può spostare il focus<br />

dell’applicazione per inserire dati di tipo diverso.<br />

NB: Focus<br />

Attribuire il focus ad un elemento di input è un aspetto molto<br />

importante dell’applicazione, in quanto permette di navigare tra i<br />

differenti elementi alfanumerici per inserire i propri dati o effettuare<br />

le proprie scelte.<br />

Nel caso di un’applicazione con un solo TextInput il focus è<br />

assegnato automaticamente, ma nel caso in cui ci siano più<br />

elementi TextInput occorre realizzare dei meccanismi per passare<br />

da un elemento ad un altro.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 60


Consideriamo ora un semplice esempio con due elementi di<br />

TextInput e vediamo come attribuire il focus ad uno di essi e fornire<br />

all’utente la consapevolezza di qual’è l’elemento selezionato.<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

TextInput {<br />

anchors.left: parent.left; y:16<br />

anchors.right: parent.right<br />

text: "Input 1"; font.pixelSize: 32<br />

color: focus ? "black" : "gray"<br />

focus:true<br />

}<br />

TextInput {<br />

anchors.left: parent.left; y:64<br />

anchors.right: parent.right<br />

text: "Input 2"; font.pixelSize: 32<br />

color: focus ? "black" : "gray"<br />

}<br />

}<br />

Nel programma di esempio, sono stati inseriti due elementi<br />

TextInput (con testo Input 1 e Input 2) aventi una proprietà<br />

particolare: assumono un colore diverso a seconda che essi<br />

abbiamo o meno il focus. L’istruzione<br />

color: focus ? "black" : "gray"<br />

come già visto in precedenza rappresenta un operatore di confronto<br />

sulla proprietà di focus. Nel caso l’elemento abbia il focus (in pratica<br />

l’utente ha eseguito un click del mouse sull’elemento TextInput)<br />

allora il colore del testo sarà nero per consentire una chiara<br />

identificazione dell’elemento in cui verranno inseriti tutti i caratteri<br />

che andremo a digitare sulla tastiera. In caso contrario il colore del<br />

testo sarà grigio, significando appunto che quell’elemento non ha il<br />

focus e quindi non riceve i caratteri della tastiera.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 61


L’istruzione:<br />

focus:true<br />

del primo TextInput consente di attribuire il focus a questo<br />

elemento all’avvio della nostra applicazione di esempio.<br />

A questo punto è possibile realizzare un meccanismo per la<br />

navigazione dei due TextInput mediante l’uso del tasto Tab. In<br />

questo modo, premendo tale tasto sposteremo il focus da un<br />

elemento all’altro e vedremo di volta in volta cambiare il colore del<br />

testo selezionato.<br />

Modificando il programma QML dell’esempio precedente nel modo<br />

seguente<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

TextInput {<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 62


id: testo1<br />

anchors.left: parent.left; y:16<br />

anchors.right: parent.right<br />

text: "Input 1"; font.pixelSize: 32<br />

color: focus ? "black" : "gray"<br />

focus:true<br />

KeyNavigation.tab: testo2<br />

}<br />

TextInput {<br />

id:testo2<br />

anchors.left: parent.left; y:64<br />

anchors.right: parent.right<br />

text: "Input 2"; font.pixelSize: 32<br />

color: focus ? "black" : "gray"<br />

KeyNavigation.tab: testo1<br />

}<br />

}<br />

Come si può osservare, i due elementi di testo sono stati identificati<br />

mediante i rispettivi identificatori (id) come testo1 e testo2.<br />

L’istruzione KeyNavigation.tab: è stata impiegata per spostare il<br />

focus usando come per la navigazione il tasto tab. Ovviamente è<br />

sempre possibile usare un altro tasto per queste operazioni di<br />

navigazione, ma occorre ricordarsi che esistono delle regole di<br />

“buon comportamento” di un’interfaccia grafica alle quali non ci<br />

spossiamo sottrarre. Ai nostri utenti non piacerà avere<br />

un’applicazione totalmente fuori standard e che li obbligherà a<br />

ricordare delle combinazioni di tasti inusuali rispetto alla pratica<br />

comune.<br />

Un’alternativa accettabile al tasto Tab per quest’applicazione è l’uso<br />

ei tasti freccia su/giu. In questo caso le istruzioni che dovremo<br />

scrivere saranno:<br />

KeyNavigation.down: testo2<br />

KeyNavigation.up: testo1<br />

ESERCIZIO<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 63


Scrivere un programma QML per muovere un’immagine qualsiasi<br />

all’interno di un rettangolo mediante I tasti freccia<br />

(up/Down/Left/Right).<br />

Il risultato dovrà quindi essere simile a figura seguente:<br />

ANIMAZIONI<br />

Le animazioni sono effetti visivi che si applicano a qualsiasi<br />

elemento di QML e permettono di “dar vita” alla nostra applicazione<br />

muovendo, ruotando, ridimensionando i conponenti grafici sul<br />

display. L’uso di animazioni all’interno di applicazioni dotate di<br />

interfaccia utente è una conquista relativamente recente, grazie<br />

all’aumento delle prestazioni dei moderni processori e all’arrivo sul<br />

mercato di veri e propri computer tascabili come i cellulari e tablet.<br />

Le caratteristiche principali delle animazioni di <strong>Qt</strong> Quick possono<br />

essere così riassunte:<br />

Ogni elemento visibile di un’applicazione può essere animato<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 64


Ogni animazione può essere programmata per realizzare dei<br />

movimenti con carateristiche diverse (movimenti lineari,<br />

rimbalzi, effetto molla o elastico)<br />

Un’animazione si può applicare a tutte le proprietà di un<br />

elemento grafico (posizione, colore, dimensioni...)<br />

<strong>Qt</strong> Quick offre un numero di animazioni preconfezionate a cui è<br />

possibile aggiungerne altre modificate ad hoc.<br />

NUMBERANIMATION<br />

Iniziamo subito con un primo esempio molto semplice di<br />

NumberAnimation<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

}<br />

Rectangle {<br />

width: 320; height:240<br />

color: "red"<br />

x:0; y:120<br />

}<br />

NumberAnimation on x {<br />

from: 0; to: 160<br />

duration:1000<br />

}<br />

In questo esempio l’applicazione è composta da due rettangoli<br />

annidati. Il rettangolo più interno (di colore rosso) verrà spostato<br />

sull’asse x dalla posizione 0 alla posizione 160 grazie all’animazione<br />

NumberAnimation<br />

NumberAnimation on x {<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 65


}<br />

from: 0; to: 160<br />

duration:1000<br />

Come si può osservare quest’animazione è applicata sulla proprietà<br />

x (la posizione sull’asse orizzontale) del rettangolo interno e farà in<br />

modo che la posizione variwerà dal valore 0 al valore 160 (from:<br />

0; to: 160) in un tempo di 1000 millesimi di secondo<br />

(duration:1000)<br />

Il risultato al termine di quest’animazione è visibile nelle due figure<br />

seguenti:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 66


PROPERTYANIMATION<br />

Una qualsiai proprietà di un elemento grafico può essere animata<br />

mediante una PropertyAnimation. A tale scopo consideriamo il<br />

seguente esempio.<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

Rectangle {<br />

width: 320; height:240<br />

color: "red"<br />

x:160; y:120<br />

id: rettangolo<br />

}<br />

PropertyAnimation {<br />

target: rettangolo<br />

properties: "width, height"<br />

from: 0; to: 240<br />

duration:1000<br />

running: true<br />

}<br />

}<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 67


Come si può intuire, in questo caso la PropertyAnimation si applica<br />

sul rettangolo rosso (target: rettangolo) e riguarda le proprietà<br />

width ed height. In altre parole, in un intervallo di tempo di 1000<br />

millisecondi (duration:1000) le dimensioni fisiche width ed height<br />

del rettangolo varieranno dal valore 0 al valore 160 (in questo caso,<br />

a termine animazione avremo un quadrato di lat 160 pixel).<br />

L’ultima istruzione nel corpo della PropertyAnimation (running:true)<br />

rappresenta l’abilitazione all’esecuzione dell’animazione stessa.<br />

L’applicazione di un valore booleano false alla proprietà running<br />

corrisponde quindi a mantenere disabilitata l’animazione (occorre<br />

pertanto ricordare che una PropertyAnimation non va in esecuzione<br />

automaticamente).<br />

Graficamente il risultato di questo programma QML sarà:<br />

e al termine dell’animazione:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 68


EASING CURVE<br />

Una caratteristica interessante di propertyAnimation è la possibilità<br />

di effettuare le animazioni con un inviluppo dato dalle easing curve.<br />

Ogni animazione può così mimare effetti realistici come rimbalzi,<br />

effetti molla o elastico etc. Per meglio comprendere questo<br />

comportamento consideriamo questo esempio:<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

Rectangle {<br />

width: 320; height:240<br />

color: "red"<br />

x:160; y:120<br />

id: rettangolo<br />

}<br />

PropertyAnimation {<br />

target: rettangolo<br />

properties: "width, height"<br />

from: 0; to: 240<br />

duration:1000<br />

running: true<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 69


}<br />

}<br />

easing.type: "OutElastic"<br />

In questo caso è stata aggiunta l’istruzione<br />

easing.type: "OutElastic"<br />

che fornisce all’animazione stessa un comportamento particolare; il<br />

ridimensionamento avverrà infatti con un’oscillazione (durante la<br />

variazione da 0 a 240 pixel), come se il rettangolo fosse dotato di<br />

caratteristiche elastiche.<br />

Qui di seguito si riportano tutte le easing curve disponibilil in <strong>Qt</strong><br />

Quick:<br />

Linear<br />

InQuad<br />

OutQuad<br />

InOutQuad<br />

OutInQuad<br />

InCubic<br />

OutCubic<br />

InOutCubic<br />

OutInCubic<br />

InQuart<br />

OutQuart<br />

InOutQuart<br />

OutInQuart<br />

InQuint<br />

OutQuint<br />

InOutQuint<br />

OutInQuint<br />

InSine<br />

OutSine<br />

InOutSine<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 70


OutInSine<br />

InExpo<br />

OutExpo<br />

InOutExpo<br />

OutInExpo<br />

InCirc<br />

OutCirc<br />

InOutCirc<br />

OutInCirc<br />

InElastic<br />

OutElastic<br />

InOutElastic<br />

OutInElastic<br />

InBack<br />

OutBack<br />

InOutBack<br />

OutInBack<br />

InBounce<br />

OutBounce<br />

InOutBounce<br />

OutInBounce<br />

La gamma di effetti che è possibile applicare alle animazioni è<br />

molto ampia, questo è un indubbio vantaggio nella realizzazione di<br />

giochi o effetti visivi per tablet e cellulari.<br />

COLORANIMATION<br />

La ColorAnimation, come facilmente intuibile dal nome, è<br />

un’animazione sul colore di un elemento grafico. Il codice QML per<br />

realizzare quest’ animazione è rappresentato dal blocco<br />

ColorAnimation{...}. La porzione di codice QML di seguito riportato<br />

permette di creare un’animazione sul colore dell’elemento<br />

rettangolo (target:rettangolo), partendo da un colore iniziale,<br />

espresso mediante la funzione <strong>Qt</strong>.rgba(0,0.5,0,1), ad un colore<br />

finale <strong>Qt</strong>.rgba(1,1,1,1). La duranta dell’animazione sarà di un<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 71


secondo (1000 millisecondi) e verrà attivata automaticamente<br />

mediante lìistruzione running:true.<br />

ColorAnimation {<br />

target: rettangolo<br />

property: "color"<br />

from: <strong>Qt</strong>.rgba(0,0.5,0,1)<br />

to: <strong>Qt</strong>.rgba(1,1,1,1)<br />

duration: 1000<br />

running: true<br />

}<br />

Il programma QML di esempio permette di animare il colore di<br />

sfondo della finestra passando da un colore nero abianco in un<br />

tempo di due secondi.<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

id: rettangolo<br />

ColorAnimation {<br />

target: rettangolo<br />

property: "color"<br />

from: <strong>Qt</strong>.rgba(0,0,0,1)<br />

to: <strong>Qt</strong>.rgba(1,1,1,1)<br />

duration: 2000<br />

running: true<br />

}<br />

}<br />

L’animazione passerà quindi da un colore nero come in figura<br />

seguente:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 72


A termine animazione si avrà invece:<br />

ROTATIONANIMATION<br />

La RotationAnimation è un’animazione ottenuta tramite la rotazione<br />

di un elemento grafico. Il codice QML per realizzare quest’<br />

animazione è rappresentato dal blocco RotationAnimation{...}. La<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 73


porzione di codice QML di seguito riportato permette di creare<br />

un’animazione di rotazione da un angolo di partenza di 45° ad un<br />

angolo finale di 315° (from: 45; to: 315), impiegando come<br />

direzione di rotazione (direction: RotationAnimation.Shortest) la<br />

“via più breve” per passare dall’angolo iniziale a quello finale. La<br />

durata di quest’animazione sarà di un secondo (duration: 1000).<br />

RotationAnimation on rotation {<br />

from: 45; to: 315<br />

direction: RotationAnimation.Shortest<br />

duration: 1000<br />

}<br />

La proprietà direction può assumere i sguenti valori:<br />

RotationAnimation.Numerical: la rotazione viene eseguita con<br />

interpolazione ineare tra i valori inziali e finali. Una variazione<br />

da 10° a 350° verrà effettuata ruotando di 340° in senso<br />

orario<br />

RotationAnimation.Clockwise: la rotazione viene eseguita<br />

sempre in senso orario tra i valori iniziale e finale<br />

RotationAnimation.Counterlockwise: la rotazione viene<br />

eseguita sempre in senso antiorario tra i valori iniziale e finale<br />

RotationAnimation.Shortest: la rotazione verrà effettuata in<br />

modo da minimizzare l’animazione. Una variazione da 10° a<br />

350° produrrà una rotazione di 20° in senso antirario<br />

L’esempio di seguito riportato permette di creare un’animazione che<br />

farà compiere una rotazione di mezzo giro (180°) all’immagine<br />

“rocket.png”<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 74


}<br />

id: rettangolo<br />

Image {<br />

id: ball<br />

source: "rocket.png"<br />

anchors.centerIn: parent<br />

smooth: true<br />

RotationAnimation on rotation {<br />

from: 0; to: 180<br />

direction: RotationAnimation.Shortest<br />

duration: 1000<br />

}<br />

}<br />

L’immagine di partenza sarà quindi la seguente<br />

A termine animazione l’immagine sarà così ruotata:<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 75


GRUPPI DI ANIMAZIONI<br />

Le animazioni di base descritte precedentemente possono essere<br />

raggruppate per ottenere effetti combinati sugli elementi grafici di<br />

un’aplicazione; si possono applicare sequenze di animazioni su uno<br />

o più elemento o eseguire più animazioni in parallelo. <strong>Qt</strong> Quick<br />

fornisce infatti due modi diversi per rappruppare le animazioni:<br />

SequentialAnimation<br />

ParallelAnimation<br />

Il primo tipo consente di eseguire in sequenza differenti animazioni,<br />

mentre il secondo consente l’applicazione parallela di più animazioni<br />

su uno stesso elemento grafico.<br />

SEQUENTIALANIMATION<br />

Come sempre, il miglior modo per comprendere un concetto è<br />

vederne l’immediata applicazione con un semplice esempio ed<br />

anche in questo caso realizzaremo un semplice programma QML<br />

adatto allo scopo.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 76


L’animazione che si vuol realizzare si compone di due parti: nella<br />

prima parte dell’animazione, l’immagine che compare sul monitor<br />

verrà ridimenzionata da un valore 100% ad un valore 50% e al<br />

termine del ridimensionamento verrà fatta svanire riducendone<br />

l’opacità dal valore massimo a zero.<br />

Il codice QML che realizza questa doppia animazione è il seguente:<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

Image {<br />

id: rocket<br />

anchors.centerIn: parent<br />

source: "rocket.png"<br />

}<br />

}<br />

SequentialAnimation {<br />

}<br />

NumberAnimation {<br />

target: rocket; properties: "scale"<br />

from: 1.0; to: 0.5; duration: 1000<br />

}<br />

NumberAnimation {<br />

target: rocket; properties: "opacity"<br />

from: 1.0; to: 0.0; duration: 1000<br />

}<br />

running: true<br />

L’animazione complessiva che vogliano realizzare è data dal gruppo<br />

di animazione SequentialAnimation {...}. Al suo interno si trovano<br />

due animationi singole (NumberAnimation) di cui la prima sarà<br />

incaricata di realizzare il ridimensionamento dell’immagine dal<br />

valore corrente 1.0 ad un valore dimezzato (0.5) e la seconda<br />

animazione sarà incaricata di far “svanire” l’immagine animandone<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 77


la sua proprietà di opacità dal valore nominale 1.0 al valore nullo<br />

(0.0).<br />

Entrambe le animazioni avranno durata di un secondo, per un<br />

totale quindi di due secondi.<br />

PARALLELANIMATION<br />

La ParallelAnimation consente la realizzazione di animazioni in<br />

parallelo, riprendendo l’esempio precedente sarà quindi possibile<br />

parallelizzare le due singole animazioni. Il codice QML per realizzare<br />

ciò farà quindi uso della ParallelAnimation come di seguito riportato.<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "white"<br />

}<br />

Image {<br />

id: rocket<br />

anchors.centerIn: parent<br />

source: "rocket.png"<br />

}<br />

ParallelAnimation {<br />

NumberAnimation {<br />

target: rocket; properties: "scale"<br />

from: 1.0; to: 0.5; duration: 1000<br />

}<br />

NumberAnimation {<br />

target: rocket; properties: "opacity"<br />

from: 1.0; to: 0.0; duration: 1000<br />

}<br />

}<br />

running: true<br />

L’animazione complessiva è data dal gruppo ParallellAnimation<br />

{...}. Al suo interno si trovano due animationi singole<br />

(NumberAnimation) che verranno eseguite contemporaneamente,<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 78


di cui la prima consentirà di realizzare il ridimensionamento<br />

dell’immagine e la seconda farà “svanire” l’immagine. Entrambe le<br />

animazioni avranno durata di un secondo (mille millisecondi),<br />

l’animazione risultante sarà quindi anch’essa di un secondo.<br />

PAUSEANIMATION<br />

Come si è visto nei paragrafi precedenti è possibile combinare<br />

diverse animazioni in sequenza e in parallelo. Esistono situazioni in<br />

cui è desiderabile inserire delle pause, a tale scopo è possibile<br />

ricorrere ad un’animazione particolare, la PauseAnimation. Come si<br />

intuisce dal nome, quest’animazione non fa nulla, serve solamente<br />

per introdurre delle pause all’interno di sequenze.<br />

Come si può intuire, l’unica proprietà di una PauseAnimation è la<br />

sua durata. Il codice di esempio sotto riportato illustra una<br />

PauseAnimation di 1 secondo (espresso in millisecondi)<br />

PauseAnimation {<br />

duration: 1000<br />

}<br />

STATI E TRANSIZIONI<br />

Il meccanismo di Stati e Transizioni rappresenta un formalismo utile<br />

per definire l’evolversi di un’applicazione in base ai comandi utente<br />

e/o agli stati interni. Si tratta in altre parole della realizzazione di<br />

una macchina a stati, concetto molto applicato in ogni applicazione<br />

dell’informatica in quanto consente di modellizzare il<br />

comportamento di un’apparecchiatura, un sistema complesso<br />

(sistemi industriali, aeronautici) o una qualsiasi situazione in cui a<br />

fronte di un evento l’applicazione può portarsi da uno stato ad un<br />

altro.<br />

Per meglio comprendere il concetto astratto di macchina a stati,<br />

consideriamo un semplice semaforo dotato di una luce verde ed<br />

una luce rossa. A luce rossa illuminata, il semaforo sarà in stato di<br />

“STOP”, a luce verde illuminata, il semaforo sarà in stato di “GO”; il<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 79


funzionamento del semaforo non prevede alcuno stato in cui<br />

entrambe le luci sono illuminate. Proviamo ora a realizzare<br />

un’applicazione con QML per visualizzare questo semaforo e<br />

cambiarne lo stato ad ogni click del mouse. L’eveto “click” del<br />

mouse assume quindi un significato concettuale importante per la<br />

nostra macchina a stati, esso infatti sarà l’evento che farà passare il<br />

semafono da STOP a GO e viceversa; esso provocherà quindi la<br />

transizione da uno stato all’altro.<br />

Il comportamento della macchina a stati “semaforo” viene<br />

solitamente schematizzato mediante un diagramma in cui i due<br />

stati STOP e GO sono rappresentati dai due ovali e le transizioni da<br />

uno stato all’altro mediante le due frecce in senso opposto.<br />

Schematicamente abbiamo quindi creato una macchina a stati che<br />

modellizza il semaforo sopra descritto. Vediamo ora la sua<br />

traduzione in linguaggio QML.<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle<br />

{<br />

width: 640; height:480<br />

color: "black"<br />

id: rettangolo<br />

Rectangle {<br />

width: 150; height: 250<br />

anchors.centerIn: rettangolo<br />

states: [<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 80


State {<br />

name: "stop"<br />

PropertyChanges { target: rosso; color:<br />

"grey" }<br />

PropertyChanges { target: verde; color:<br />

"green" }<br />

},<br />

State {<br />

name: "go"<br />

PropertyChanges { target: rosso; color:<br />

"red" }<br />

PropertyChanges { target: verde; color:<br />

"grey" }<br />

}<br />

]<br />

Rectangle {<br />

id: rosso<br />

x: 25; y: 15; width: 100; height: 100<br />

color: "red"<br />

}<br />

Rectangle {<br />

id: verde<br />

x: 25; y: 135; width: 100; height: 100<br />

color: "grey"<br />

}<br />

MouseArea {<br />

anchors.fill: parent<br />

onClicked: parent.state == "stop" ?<br />

parent.state = "go" : parent.state = "stop"<br />

}<br />

}<br />

}<br />

La realizzazione grafica del semaforo è ottenuta mediante due<br />

elementi rectangle, uno di colore rosso e uno di colore verde,<br />

identificati rispettivamente come “rosso” e “verde”, tuttavia il<br />

semaforo si presenterà all’avvio del programma con la sola luce<br />

rossa illuminata (per cui il colore del rettangolo “verde” all’inizio<br />

sarà in realtà grigio).<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 81


La realizzazione del meccanismo di stati e transizioni avviene<br />

mediante due blocchi di istruzioni, il blocco states[...] consente di<br />

definire tutti gli stati dell’applicazione, per quanto riguarda invece la<br />

realizzazione delle transizioni si ricorre all’implementazione di una<br />

MouseArea{...} al cui interno verranno effettuati i controlli<br />

necessari per effettuare la variazione di stato.<br />

Iniziamo dapprima con l’implementazione degli stati STOP e GO :<br />

states: [<br />

State {<br />

name: "stop"<br />

PropertyChanges { target: rosso; color:<br />

"grey" }<br />

PropertyChanges { target: verde; color:<br />

"green" }<br />

},<br />

State {<br />

name: "go"<br />

PropertyChanges { target: rosso; color:<br />

"red" }<br />

PropertyChanges { target: verde; color:<br />

"grey" }<br />

}<br />

]<br />

All’interno del blocco states trovano quindi posto i due stati del<br />

nostro semaforo: “stop” e “go”.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 82


CUSTOM ITEMS<br />

I custom items rappresentano un modo per creare elementi<br />

riusabili, essi devono essere definiti in files QML separati,<br />

rispettando la regola un solo custom item per ogni file e possono<br />

essere usati come qualsiasi altro elemento di QML. Una<br />

caratteristica importante dei custom items riguarda la possibilità di<br />

associarne un numero di versione in modo tale da garantire il<br />

comportamento funzionale quando usato in programmi diversi.<br />

DEFINIRE UN CUSTOM ITEM<br />

Supponiamo di voler realizzare un semplice Custom Item con<br />

capacità di editor a linea. Salvando questo Custom Item nel file<br />

LineEdit.qml andiamo ad identificare un nuovo elememento di nome<br />

LineEdit appunto che potrà essere usato in tutte i nostri programmi<br />

QML.<br />

Vediamo il codice QML per realizzare questo Custom Item<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle {<br />

border.color: "green"<br />

color: "white"<br />

radius: 4; smooth: true<br />

TextInput {<br />

anchors.fill: parent<br />

anchors.margins: 5<br />

text: "Enter text..."<br />

color: focus ? "black" : "gray"<br />

font.pixelSize: parent.height - 4<br />

}<br />

}<br />

Come si può osservare, il codice QML di LineEdit è un normale<br />

codice QML di un elemento rettangolo contenente al suo interno un<br />

TextInput.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 83


Il file LineEdit.qml dovrà far parte del nostro progetto qml, come<br />

riportato dalla finestra projects sul lato sinistro di <strong>Qt</strong> Creator:<br />

Data una struttura così semplice, vediamo ora come utilizzare il<br />

custom Item e successivamente introdurremo la possibilità di<br />

definire nuove proprietà del nostro elemento.<br />

USARE UN CUSTOM ITEM<br />

Per usare LineEdit in qualsiasi programma QML potremo scrivere il<br />

codice seguente:<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle {<br />

width: 400; height: 100; color: "lightblue"<br />

LineEdit {<br />

anchors.horizontalCenter: parent.horizontalCenter<br />

anchors.verticalCenter: parent.verticalCenter<br />

width: 300; height: 50<br />

}<br />

}<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 84


Il risultato del nostro programma è visibile in figura seguente:<br />

Possiamo infatti osservare la finestra con colre di sfondo azzurro<br />

che contiene il nostro Custom Item di nome LineEdit<br />

Il nostro Custom Item è ora visibile, è possibile scrivere un testo<br />

arbitrario al suo interno, ma esso non espone nessuna proprietà. In<br />

altre parole non abbiamo modo di leggere il contenuto di LineEdit.<br />

Serve pertanto un modo per rendere disponibili le proprietà dei<br />

Custom Item agli eltri elementi di un programma QML.<br />

PROPRIETÀ DI UN CUSTOM ITEM<br />

Il modo per rendere disponibili le proprietà di un Custom Item è<br />

molto semplice, è sufficiente riportare nel file contenente il nostro<br />

Custom Item la sintassi<br />

Syntax: property [: ]<br />

Per ogni proprietà che si vuol rendere disponibile per l’elemento<br />

creato.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 85


Nel caso di LineEdit il codice del programma QML diventerà:<br />

import <strong>Qt</strong>Quick 1.0<br />

Rectangle {<br />

border.color: "green"<br />

color: "white"<br />

radius: 4; smooth: true<br />

TextInput {<br />

id: text_input<br />

anchors.fill: parent<br />

anchors.margins: 2<br />

text: "Enter text..."<br />

color: focus ? "black" : "gray"<br />

font.pixelSize: parent.height - 4<br />

}<br />

property string text: text_input.text<br />

}<br />

Analizziamo in dettaglio la sintassi<br />

property string text: text_input.text<br />

in questo modo rendiamo disponibile come proprietà “text” una<br />

stringa, ovvero una sequenza di caratteri (“string”) il cui valore è<br />

dato dalla stessa proprietà “.text” dell’elemento TextInput di nome<br />

text_input.<br />

Il fatto di “esportare” questa proprietà si rende necessario poichè a<br />

livello di “LineEdit” non è automatico (e neppure sicuro e pulito da<br />

un punto di vista della programmazione) accedere ai componenti<br />

interni del Custom Item. Questo meccanismo si rende quindi<br />

necessario per definire una sorta di “interfaccia” pubblica che il<br />

nuovo componente mette a disposizione di tutti.<br />

A titolo di esempio si riportano qui di seguito alcune definizioni di<br />

proprietà<br />

property string product: "<strong>Qt</strong> Quick"<br />

property int count: 123<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 86


property real slope: 123.456<br />

property bool condition: true<br />

property url address: "http://qt.nokia.com/"<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 87


SIGNALS&SLOTS<br />

L'intero meccanismo di meta object system, è stato inventato dai<br />

programmatori della Trolltech (detti anche Trolls, richiamando le<br />

antiche figure della mitologia norvegese a cui si attribuivano poteri<br />

magici) per consentire agli utenti del toolkit di scrivere il proprio<br />

codice sorgente, senza doversi perdere nei dettagli del sistema<br />

operativo sottostante.<br />

Il punto cruciale a cui i Trolls dovevano trovare soluzione, era<br />

quello di far comunicare tra loro gli oggetti C++ della loro libreria,<br />

senza per questo dover dipendere dai metodi di comunicazione<br />

nativi (quali ad esempio la gestione degli eventi di MS Windows o di<br />

X11), in modo da rimanere indipendenti dall'implementazione.<br />

Prima di addentrarci nell'analisi del meccanismo di comunicazione<br />

adottato da <strong>Qt</strong> (chiamato Signals&Slots), cerchiamo di capire in<br />

cosa consiste il problema.<br />

Supponiamo di avere una finestra di dialogo contenente due oggetti<br />

grafici molto semplici, un bottone ed un indicatore visivo<br />

(immaginiamo, a titolo di esempio, qualcosa di simile alla lampada<br />

di un semaforo, di colore rosso) e supponiamo inoltre di voler<br />

dotare la nostra finestra di una semplice funzionalità: quando viene<br />

eseguito un click del mouse sul bottone grafico (in altre parole, il<br />

bottone viene “premuto”), il colore del nostro semaforo diventa<br />

verde.<br />

Il semplice esempio sopra riportato, ci pone di fronte al problema di<br />

far comunicare tra loro i nostri due oggetti grafici: il pulsante ed il<br />

semaforo; in altre parole, quando il pulsante viene premuto, deve<br />

essere emesso un “segnale” al semaforo, in modo che esso possa<br />

riconoscere l'evento e cambiare colore.<br />

In estrema sintesi, il nostro problema di comunicazione può essere<br />

descritto con le parole di “segnale”, corrispondente all'evento di<br />

bottone premuto e “cambio colore”, funzione propria dell'oggetto<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 88


grafico semaforo, innescata dal segnale di bottone premuto<br />

(usando la terminologia <strong>Qt</strong>, questo è uno “slot”). Allo stato attuale<br />

delle cose, abbiamo identificato un segnale ed uno slot, ciò che<br />

ancora ci manca è un metodo per il loro collegamento. Il<br />

meccanismo di meta object system di <strong>Qt</strong>, ci viene in soccorso<br />

offrendoci una funzione (connect), indipendente dalla piattaforma,<br />

per realizzare questa connessione.<br />

La breve introduzione fatta al meccanismo di Signals&Slots, ci<br />

consente di capire l'importanza fondamentale che esso riveste nella<br />

programmazione <strong>Qt</strong>; ciò che invece non è ancora stato chiarito è<br />

perché questo meccanismo deve essere indipendente dalla<br />

piattaforma. Per poter apprezzare il lavoro svolto dai Trolls,<br />

gettiamo una rapida occhiata su altri due GUI toolkits molto famosi:<br />

Motif ed MFC.<br />

Per entrambi i toolkits, il sistema di gestione delle finestre<br />

sottostante (X-Window per Motif e MS Windows per MFC), fornisce<br />

al software applicativo, indicazioni molto “primitive” delle<br />

interazioni con l'utente. Ad esempio, le informazioni riportate<br />

possono essere del tipo: “l'utente ha premuto il tasto T”, oppure,<br />

“l'utente ha premuto il bottone sinistro del mouse alle coordinate<br />

320, 320”. Come si può capire, partendo da queste informazioni<br />

basilari, costruire un'applicazione dotata di interfaccia uomo<br />

macchina molto complessa, richiede un tempo notevole ed inoltre<br />

tenere sotto controllo un numero elevato di dettagli di basso livello,<br />

dovuti alla natura della piattaforma sottostante, è spesso causa di<br />

errori e inevitabilmente si traduce in tempi di sviluppo (e<br />

debugging) molto lunghi.<br />

L'esigenza di semplificare la programmazione della piattaforma<br />

grafica (il window manager) ha portato quindi alla creazione dei due<br />

toolkits prima citati, che sono divenuti nel tempo il riferimento per il<br />

mondo Windows e il mondo UNIX. Ciascun toolkit ha presentato la<br />

propria soluzione ai problemi tipici di programmazione di una<br />

interfaccia grafica e come spesso accade, nessuno sforzo è stato<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 89


compiuto per uniformare i due ambienti. Come risultato, abbiamo<br />

ora due toolkits grafici completamente svincolati e incompatibili tra<br />

loro, per cui scrivere un'applicazione per entrambi i sistemi<br />

operativi (MS Windows e UNIX-Motif) richiede la stesura di due<br />

interfacce utenti completamente diverse, con grande spreco di<br />

risorse per lo sviluppo (e il test).<br />

Per dare un esempio tangibile di questa diversità, vediamo come è<br />

stato risolto dai due toolkits il problema della comunicazione e<br />

vedremo infine come è stato risolto il problema dai Trolls in modo<br />

elegante e “platform-independent” (indipendente dalla<br />

piattaforma).<br />

Motif implementa la comunicazione tramite il meccanismo detto a<br />

“callback”. Le callback sono funzioni C, dotate di argomenti di<br />

chiamata predefiniti e vengono “registrate” (in pratica si registra il<br />

puntatore alla funzione callback da chiamare a fronte di un evento<br />

del mouse) all'interno di ogni componente grafico (o widget, nella<br />

terminologia Motif). Chiaramente, ogni widget Motif, deve<br />

riconoscere un preciso numero di callback, così come deve<br />

conoscerne il tipo e tutti i parametri (compreso il tipo dei parametri<br />

stessi), tornando al nostro esempio di partenza, un bottone Motif<br />

riconoscerà quindi le funzioni di callback per gli eventi di pressione,<br />

rilascio e click del mouse.<br />

Supponiamo ora che un bottone Motif venga premuto, il codice al<br />

suo interno andrà a verificare di quale evento si tratta, lo<br />

riconoscerà e chiamerà la funzione di callback associata o meglio la<br />

chiamerà usando il suo puntatore a funzione (il cui indirizzo è stato<br />

memorizzato in precedenza durante l'operazione di registrazione).<br />

Lo svantaggio principale di questa implementazione è che se la<br />

funzione callback (scritta dal programmatore applicativo e quindi<br />

situato sopra il toolkit stesso) non è perfettamente in linea con<br />

quanto si attende il toolkit, supponiamo ad esempio che un<br />

parametro sia un array e che il numero di elementi non sia uguale<br />

tra quanto si attende il toolkit e quanto è stato scritto dal<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 90


programmatore applicativo, allora l'applicazione potrebbe bloccarsi<br />

e andare in crash (sappiamo infatti che i compilatori C non<br />

eseguono controlli sulle dimensioni degli array).<br />

MFC impiega invece delle macro precostruite per realizzare il<br />

collegamento tra gli eventi forniti dal gestore delle finestre,<br />

chiamati anche messaggi nella terminologia Windows, con i metodi<br />

C++ (che sono praticamente funzioni callback) per la gestione degli<br />

eventi. Uno degli svantaggi principali che tutti i programmatori MFC<br />

hanno sperimentato è la complessità del “message system” di MS<br />

Windows, anche quando ci si avvale degli ambienti di sviluppo<br />

integrato e dei wizards per la creazione di finestre di dialogo<br />

basandosi su templates.<br />

Come si può constatare, il problema della comunicazione è stato<br />

risolto dai due toolkits in due modi tra loro differenti; in estrema<br />

sintesi possiamo dire che, in un caso si ricorre a puntatori a<br />

funzione (Motif), nell'altro ci si appoggia a macro per collegare i<br />

messaggi di MS Windows ai metodi C++ di gestione degli eventi<br />

(MFC).<br />

SEGNALI DI UN CUSTOM ITEM<br />

Il meccanismo di Signal&Slot del <strong>Qt</strong> Application Framework può<br />

essere impiegato in modo molto semplice anche con <strong>Qt</strong> Quick.<br />

Tramite esso è quindi possibile dare ad un Custom Item la<br />

possibilità di generare “segnali” ad esempio quando viene generato<br />

un evento con il mouse sull’elemento stesso (così come avveniva<br />

nel caso di onClicked negli esempi di paragrafo...).<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 91


CONCLUSIONE<br />

Come risulta evidente dalla sua lettura, questo libro non è<br />

completo, anzi è appena all’inizio. I prossimi paragrafi<br />

riguarderanno i custom items, l’integrazione con il mondo C++,<br />

l’uso di elementi complessi, il model view, l’integrazione con<br />

database e molto altro ancora. Il completamento di questo libro<br />

terrà conto dei commenti e contributi che arriveranno sul blog<br />

dell’autore e verrà corredato dei files QML degli esempi riportati.<br />

<strong>Introduzione</strong> a <strong>Qt</strong> Quick -beta- Page 92

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!