Introduzione a Qt Quick™ - sereno-labs
Introduzione a Qt Quick™ - sereno-labs
Introduzione a Qt Quick™ - sereno-labs
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