Introduzione a QML e integrazione con il C++

Slides:



Advertisements
Presentazioni simili
Table View. Problemi ricorrenti Una situazione ricorrente è quella in cui il controller potrebbe avere un’altezza superiore a quella dello schermo. In.
Advertisements

JUG – Ancona Italy AJAX Giovanni Baleani Developer IBS srl.
Giuditta Cantoni, 4 E S.I.A I DATABASE. Definizione databese In informatica, il termine database, banca dati o base di dati (a volte abbreviato con il.
Presentazione della piattaforma e - learning MOODLE a cura di Davide Afretti Bologna, 24 aprile 2013.
H T M L Hyper Text Markup Language L' HTML è un linguaggio di markup usato per la creazione di documenti ipertestuali sotto forma di pagine web.
PGDay 2009 FSGateway Ing. Torello Querci Resp. Architetture SW - Negens S.r.l. 4 Dicembre 2009, Pisa.
Gruppo Alpini Rivoli sezione Torino
Basi di dati - Fondamenti
Facile da usare Un'interfaccia amministrativa completamente rinnovata, iniziare con Drupal è più facile!
Corso di Elementi di Informatica
Ereditarietà Uno dei principi della programmazione orientata agli oggetti (OOP) è il riuso Le classi dovrebbero essere progettate come componenti riutilizzabili.
Corso per Webmaster base
IL SOFTWARE (FPwin 6.0).
Lato Server - OMNIS Web Web Services.
Crea il tuo sistema aziendale sul web a partire dei fogli Excel che usi. ShareXLS
“Vivere insieme” – Lezione4
ODMG.
GeoGebra QuizFaber Formazione tra pari
EasyGraph Dynamic web-based dashboard
Applicazione web basata su web service e web socket
REX - Istruzioni tipo IKEA
Programmazione per la Musica | Adriano Baratè
Gestire la navigazione
Sistema di Analisi e di Acquisizione
Sviluppare applicazioni usando la piattaforma di Firefox
Analysis framework of distributed thread and malware data-sources
Script Marco D. Santambrogio –
Il Binding Nicolò Sordoni.
Condividere dati di Excel tramite l'esportazione in un sito di SharePoint
Paradigma MVC Ing. Buttolo Marco.
Programmazione a oggetti
Job Application Monitoring (JAM)
LA GESTIONE DEI PACCHETTI
* Il Sistema Operativo GNU/Linux * Sistema Operativo e Applicazioni
Qt by Examples LINUX DAY
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
Asynchronous JavaScript and XML
I tag essenziali.
Sviluppo di un'applicazione web per l'utilizzo del framework SparkER
Creazione di pagine per Internet
Corso di Ingegneria del Web A A Domenico Rosaci 1
istalliamo l’ambiente di sviluppo - ide
Ecco tutte le informazioni Microsoft Notizie di SharePoint
Progetto di Tecnologie Web 2014/2015 THERMOWEB
OBJECT ORIENTED DATABASE
Access.
[Nome progetto] Relazione finale
Basi di dati - Fondamenti
Programmare.
Come personalizzare il sito Web online di Microsoft SharePoint
ABAP Objects ALV Grid Mantova, 30 dicembre 2018.
Esercitazioni di C++ 31 dicembre 2018 Claudio Rocchini IGMI.
ADO Per gestire i database con tecnologia ASP si utilizzano strumenti ADO (ActiveX Data Objects): un'architettura che fornisce oggetti.
© 2007 SEI-Società Editrice Internazionale, Apogeo
[Nome progetto] Relazione finale
UNIVERSITÀ DEGLI STUDI DI MODENA E REGGIO EMILIA
Definizione di linguaggio di programmazione
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
OpenLayers Client di mappe “non solo” WMS
DOM Document Object Model.
Fogli elettronici e videoscrittura
Excel 3 - le funzioni.
UNIVERSITÀ DI MODENA E REGGIO EMILIA
Unità 1 Programmi base.
A-to-Z Consente di Localizzare e Accedere a tutte le risorse della biblioteca: riviste online riviste cartacee riviste nelle banche dati in full text riviste.
Il nuovo scratch desktop
Array e Stringhe Linguaggio C.
Lezione 7 Editing digitale della partitura Creazione di plug-in con interfaccia grafica Laboratorio di Informatica Musicale – Prof. Luca A. Ludovico.
CLOUD.
Transcript della presentazione:

Introduzione a QML e integrazione con il C++

Sommario Introduzione a Qt Qt Quick caratteristiche e componenti principali QML Primi passi (Sintassi, tipi base, attributi) Creare un progetto in Qt Creator Implementazione e utilizzo di alcuni dei controlli principali del framework Integrazione C++/QML Esportare dati e funzionalità da C++ a QML Esportare e manipolare oggetti QML attraverso codice C++ Importare dati e funzionalità da C++ a QML utilizzando i plugin

Introduzione a Qt CENNI STORICI 1991: Haavard Nord e Eirik Chambe-Eng iniziano a sviluppare QT Q lettera esotica in Norvegese, t dal toolkit X 4 Marzo 1994: Trolltech viene fondata a Oslo 28 Gennaio 2008: acquisizione da parte di Nokia 11 Agosto 2009 nome cambia in Qt Development Frameworks Marzo 2011: Nokia vende la licenza commerciale a Digia Acquisizione completa Settembre 2012 Settembre 2014 creazione Qt Company sede Espoo, Finlandia R&D Oslo, teams a Berlino e Oulu

Introduzione a Qt CENNI STORICI Settembre 1996: 1.0 prima versione stabile 1999 Ultima versione stabile 1.45 Giugno 1999: versione 2 2.0 QPL 2.2 GPL X11/Linux Marzo 2001: 2.3 ultima versione stabile Ottobre 2001 : versione 3 Upgraded Qt Designer, Qt Assistant, Text Editor, Db connectivity Aggiunto supporto Mac Os X Febbraio 2004: 3.3 ultima versione stabile Giugno 2005: versione 4 COM and MVC, WebKit, enhanced XML support, QML, QtCreator Riorganizzazione interna della libreria Dicembre 2011: 4.8 ultima versione stabile Dicembre 2012: versione 5 Maggior supporto a QML e Javascript, C++ ancora supportate, consolidamento di Qt Platform Abstraction per migliorare portabilità cross- platform Maggio 2018: 5.11 ultima versione stabile

Introduzione a Qt Qt è essenzialmente un toolkit GUI multipiattaforma per lo sviluppo di applicazioni software che utilizzano standard C ++. Fornisce agli sviluppatori tutte le funzionalità essenziali richieste per creare applicazioni multipiattaforma con GUI "state-of-the- art". Poiché Qt utilizza C ++, è completamente orientato agli oggetti e consente una programmazione dei componenti facilmente estensibile. Qt è commercializzato come un framework "write once, compile anywhere" che fa risparmiare tempo agli sviluppatori perché hanno solo bisogno di creare e mantenere un unico codice base in qualsiasi piattaforma decidano di sviluppare e il software finale verrà compilato in ogni altra piattaforma.

Introduzione a Qt Qt offre i seguenti vantaggi: Porting di un'applicazione su più piattaforme tramite una semplice ricompilazione Creazione di un'applicazione che gira a velocità nativa e con un aspetto e una piattaforma nativa alla piattaforma su cui è in esecuzione Sistema dinamico delle proprietà Gestione semplificata della memoria dinamica Meccanismo di Signal/Slot

Introduzione a Qt Qt offre i seguenti vantaggi: Porting di un'applicazione su più piattaforme tramite una semplice ricompilazione Creazione di un'applicazione che gira a velocità nativa e con un aspetto e una piattaforma nativa alla piattaforma su cui è in esecuzione Sistema dinamico delle proprietà Gestione semplificata della memoria dinamica Meccanismo di Signal/Slot

Introduzione a Qt Gestire la memoria in programmi complessi e altamente dinamici non è facile. Qt fornisce un sistema agevole per gestire il lifetime degli oggetti I QObject sono organizzati in gerarchie ad albero Ogni QObject ha un parent e N children Quando il parent viene distrutto, vengono distrutti anche tutti gli oggetti nel sotto-albero associato Quando un figlio viene distrutto, il parent viene notificato Tutti i QObject con un parent vanno allocati sullo heap

Introduzione a Qt Qt offre i seguenti vantaggi: Porting di un'applicazione su più piattaforme tramite una semplice ricompilazione Creazione di un'applicazione che gira a velocità nativa e con un aspetto e una piattaforma nativa alla piattaforma su cui è in esecuzione Sistema dinamico delle proprietà Gestione semplificata della memoria dinamica Meccanismo di Signal/Slot

Introduzione a Qt Signal e Slot Problema generale: come collegare l’evento di click di un bottone della GUI alla logica di business dell’applicazione Possibili soluzioni: Callback Basate su puntatori a funzioni Non type-safe

Introduzione a Qt Signal e Slot Problema generale: come collegare l’evento di click di un bottone della GUI alla logica di business dell’applicazione Possibili soluzioni: Observer Pattern (Listener) Basati su interfacce Necessità sottoscrizione Richiedono molte classi interfaccia

Introduzione a Qt Signal e Slot Problema generale: come collegare l’evento di click di un bottone della GUI alla logica di business dell’applicazione Possibili soluzioni: Signals e Slots (callback alto livello) Metodi virtuali (eventi basso livello)

Qt Quick Ambiente di sviluppo open source che permette di scrivere facilmente applicazioni “multidevice” per PC, smartphone, tablet e dispositivi embedded. Include Linguaggio di programmazione dichiarativo basato su Javascript: il QML. Un IDE, il Qt Creator che supporta il QML C++ API per l’integrazione con le applicazioni Qt

Qt Quick Il modulo Qt Quick rappresenta la libreria standard per scrivere applicazioni QML e fornisce i tipi di base necessari per la creazione di interfacce utente con QML Fornisce un pannello visuale per la rappresentazione visiva degli elementi e la creazione di oggetti. Il modulo Qt Quick fornisce sia una API QML che mette a disposizione i tipi per la creazione di interfacce utente con il linguaggio QML, sia una API C ++ per estendere le funzionalità di QML utilizzando C++. Fornisce tutto il necessario per creare una applicazione con un'interfaccia utente fluida e dinamica.

Qt Quick Aspetti fondamentali Pannello visuale: pannello z-ordinato con sistema di coordinate bidimensionale con un proprio motore di rendering User input: Touch (Flickable item) Mouse (Mouse Area and Mouse events) Tastiera (Keys events, text input) Gestures (modulo Qt Sensors): non c’è un supporto diretto alle gesture del dispositivo ma il modulo mette a disposizione tipi che forniscono il supporto per tali gestures Posizionamento Manuale: efficace se la user interface è statica Collegamento dinamico Anchors: molto più performante del collegamento dinamico Posizionatori Layout

Qt Quick Aspetti fondamentali Stati, transizioni e animazioni Stati – Insieme di informazioni che descrive come e dove vengono visualizzate le singole parti componenti dell'elemento visivo e tutti i dati associati a tale stato Ciascuno stato può avere un certo aspetto visivo associato. Transizioni - Quando un elemento visivo passa da uno stato a un altro, l'aspetto di quell'elemento cambierà. Una transizione è un «confine" tra due stati. Qt Quick fornisce il tipo Transition che ha proprietà che definiscono cosa accade quando l'applicazione passa da uno stato ad un altro. Animazioni - Durante la transizione tra stati, è possibile utilizzare un'animazione fluida per aiutare l'utente durante la transizione. Le modifiche brusche e inaspettate dovrebbero essere evitate. Models e Views Effetti grafici Convenience Types

Qt Quick Convenience Types In un'interfaccia utente altamente dinamica, lo sviluppatore dell'applicazione desidera spesso reagire agli eventi e attivare varie logiche di risposta. QML ha un supporto integrato per questi concetti tramite bind, segnali e signal handler e istanze di oggetti dinamici, ma Qt Quick espande il supporto fornito dalla lingua con vari tipi detti convenience Instanziamento dinamico Dal codice Javascript Tipi che supportano la gestione dinamica degli oggetti (Loader,ListView..) Binding dinamico Tipo Binding Connessione di segnali dinamica Tipo Connections

QML QML è un linguaggio dichiarativo che consente a sviluppatori e progettisti di creare applicazioni altamente performanti, fluide e visivamente accattivanti. Sintassi dichiarativa, molto leggibile, JSON-like con supporto per le fondamentali espressioni JavaScript. Fornisce un framework per lo sviluppo di applicazioni e librerie con il linguaggio QML. Definisce e implementa il linguaggio e il motore Fornisce un API per consentire allo sviluppatore di estendere il linguaggio QML con tipi personalizzati e integrare il codice QML con JavaScript e C ++. Il codice sorgente QML viene generalmente caricato dal motore tramite documents usati per definire i tipi di oggetto QML che possono poi essere riutilizzati in un'applicazione I nomi dei tipi devono iniziare con una lettera maiuscola per poter essere dichiarati come tipi di oggetto QML in un file QML.

QML Vantaggi Integrazione con il C++ Integrazione con Javascript Sintassi semplice e poco dispendiosa in termini di righe di codice Sintassi JSON-Like familiare per chi lavora con tecnologie web Maggiore velocità sui dispositivi mobili

QML Vantaggi Ma..... Integrazione con il C++ Integrazione con Javascript Sintassi semplice e poco dispendiosa in termini di righe di codice Sintassi JSON-Like familiare per chi lavora con tecnologie web Maggiore velocità sui dispositivi mobili Ma..... QML deve risolvere tipi dinamici, creare strutture di dati per rappresentare binding di proprietà e passare attraverso il sistema di tipi di meta oggetti Qt per accedere a qualsiasi membro nativo. C ++ tutto ciò al momento della compilazione

QML SINTASSI DI BASE Un documento QML è una stringa conforme alla sintassi QML e definisce un tipo di oggetto QML. Un documento viene generalmente caricato da un file ".qml" memorizzato localmente o in remoto, ma può essere costruito manualmente nel codice. Un'istanza del tipo di oggetto definita da un documento può essere creata utilizzando un Component nel codice QML o un QQmlComponent in C ++. In alternativa, se il tipo di oggetto è esplicitamente esposto al sistema di tipi QML con un particolare nome di tipo, il tipo può essere utilizzato direttamente nelle dichiarazioni oggetto in altri documenti. La possibilità di definire tipi di oggetti QML riutilizzabili nei documenti è un importante strumento per consentire di scrivere codice modulare, altamente leggibile e gestibile. Un documento QML è costituito da due sezioni: la sezione importazioni e la sezione dichiarazione oggetto. La sezione delle importazioni in un documento contiene istruzioni di importazione che definiscono quali tipi di oggetto QML e risorse JavaScript possono essere utilizzate dal documento. La sezione dichiarazione oggetto definisce la struttura ad albero da creare durante l'istanziazione del tipo di oggetto definito dal documento.

QML SINTASSI DI BASE Dichiarazioni di Import import Namespace VersionMajor.VersionMinor import Namespace VersionMajor.VersionMinor as SingletonTypeIdentifier import "directory" import "file.js" as ScriptIdentifier Dichiarazioni di oggetti Oggetti figli Qualsiasi dichiarazione di oggetto può definire oggetti figlio attraverso dichiarazioni di oggetti nidificati. Qualsiasi dichiarazione di oggetto dichiara implicitamente una struttura ad oggetti che può contenere un numero qualsiasi di oggetti figlio.

QML SINTASSI DI BASE Attributi degli oggetti QML Ogni tipo di oggetto QML ha un insieme definito di attributi. Ogni istanza di un tipo di oggetto viene creata con il set di attributi che sono stati definiti per quel tipo di oggetto. Il set di tipi di attributi del tipo di oggetto QML è il seguente: Attributo id Attributi di proprietà Attributi signal Attributi signal handler : aggiungere un segnale a una definizione di oggetto in QML aggiungerà automaticamente un signal handler associato alla definizione dell'oggetto, che ha, di default, un'implementazione vuota. Attributi di metodo: una funzione che può essere chiamata per eseguire una elaborazione o triggerare ulteriori eventi (Q_INVOKABLE o Q_SLOT per oggetti C++) Proprietà associate e signal handlers associati: consentono agli oggetti di essere agganciati a proprietà aggiuntive o gestori di segnale che altrimenti non sarebbero disponibili per l'oggetto. In particolare, consentono agli oggetti di accedere a proprietà o segnali propri di un altro oggetto. Attributi enumerazione

QML SINTASSI DI BASE Attaching properties I meccanismi per fornire oggetti collegati possono essere implementati da C ++ fornendo classi per il tipo di oggetto attaching e il tipo attached. Attaching: Implementa il metodo statico qmlAttachedProperties () che ha come valore di ritorno un’istanza del tipo attached static <AttachedPropertiesType> *qmlAttachedProperties(QObject *object); Viene dichiarato chiamando la macro QML_DECLARE_TYPEINFO () con il flag QML_HAS_ATTACHED_PROPERTIES Attached: Implementa e definisce proprietà e segnali da collegare

QML SINTASSI DI BASE Attaching properties Quando si considera una proprietà di questo tipo, ci sono diverse parti coinvolte: Una istanza di un tipo di oggetto collegato, con una proprietà o un segnale definiti, collegato all'oggetto Item per consentirne l'accesso e impostare questi attributi. Un oggetto che rappresenta l'attachee a cui va collegata l'istanza del tipo di oggetto collegato. Un tipo collegamento, che fornisce all'attestato un qualificatore, tramite il quale può accedere agli attributi del tipo di oggetto collegato.

QML SINTASSI DI BASE Attaching properties – Attachee class Message : public QObject { Q_OBJECT Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged) Q_PROPERTY(QDateTime creationDate READ creationDate WRITE setCreationDate NOTIFY creationDateChanged) public: // ... };

QML SINTASSI DI BASE Attaching properties – Attached type class MessageBoardAttachedType : public QObject { Q_OBJECT Q_PROPERTY(bool expired READ expired WRITE setExpired NOTIFY expiredChanged) public: MessageBoardAttachedType(QObject *parent); bool expired() const; void setExpired(bool expired); signals: void published(); void expiredChanged(); };

QML SINTASSI DI BASE Attaching properties – Attaching type class MessageBoard : public QObject { Q_OBJECT public: static MessageBoard *qmlAttachedProperties(QObject *object) return new MessageBoardAttachedType (object); } }; QML_DECLARE_TYPEINFO( MessageBoard, QML_HAS_ATTACHED_PROPERTIES)

QML SINTASSI DI BASE Attaching properties – Attaching type QML C++ Message { author: "Amelie" creationDate: new Date() MessageBoard.expired: creationDate < new Date("January 01, 2015 10:45:00") MessageBoard.onPublished: console.log("Message by", author, "has been published!") } C++ Message *msg = someMessageInstance(); MessageBoardAttachedType *attached = qobject_cast<MessageBoardAttachedType*>(qmlAttachedPropertiesObject<MessageBoard>(msg)); qDebug() << "Value of MessageBoard.expired:" << attached->expired();

QML SINTASSI DI BASE Segnali e Signal handler QML ha un meccanismo di signal handler. Quando viene emesso un segnale, viene richiamato il corrispondente signal handler. Inserendo la logica come script o altre operazioni nel gestore consente al componente di rispondere all'evento. Per ricevere una notifica quando un particolare segnale viene emesso per un particolare oggetto, la definizione dell'oggetto deve dichiarare un gestore di segnale denominato on<Signal> dove <Signal> è il nome del segnale, con la prima lettera maiuscola. Il gestore di segnale dovrebbe contenere il codice JavaScript da eseguire quando viene richiamato il gestore di segnale Un segnale viene emesso automaticamente quando il valore di una proprietà QML cambia. Questo tipo di segnale è un segnale di modifica delle proprietà e i gestori di segnale per questi segnali sono scritti nel modulo su on<Property>Changed dove <Property> è il nome della proprietà, con la prima lettera maiuscola. Ad esempio, il tipo MouseArea ha una proprietà pressed. Per ricevere una notifica ogni volta che questa proprietà cambia, scrivi un gestore di segnale denominato onPressedChanged

QML SINTASSI DI BASE Segnali e Signal handler In alcuni casi potrebbe essere preferibile accedere a un segnale esterno all'oggetto che lo emette. Per questi scopi, il modulo QtQuick fornisce il tipo Connections per la connessione a segnali di oggetti arbitrari. Un oggetto Connections può ricevere qualsiasi segnale dalla sua destinazione specificata. I segnali possono essere aggiunti ai tipi QML personalizzati tramite la parola chiave signal. Un segnale viene emesso invocando il segnale come metodo. La sintassi per la definizione di un nuovo segnale è: signal <nome> [([<tipo> <nome parametro> [, ...]])] Gli oggetti di segnale hanno un metodo connect () per collegare un segnale a un metodo o a un altro segnale. Quando un segnale è collegato a un metodo, il metodo viene automaticamente richiamato ogni volta che viene emesso il segnale. Questo meccanismo consente a un segnale di essere ricevuto da un metodo anziché da un gestore di segnali.

QML Tipi QML I tipi che possono essere utilizzati nella definizione di oggetti in un documento QML possono essere: forniti in modo nativo dal linguaggio QML registrati via C ++ dai moduli QML forniti come documenti QML dai moduli QML Inoltre, gli sviluppatori di applicazioni possono fornire i propri tipi, registrando direttamente i tipi C ++ o definendo componenti riutilizzabili nei documenti QML che possono quindi essere importati. Ovunque la definizione del tipo provenga, il motore applicherà la caratteristica type-safety per le proprietà e le istanze di tali tipi.

QML Tipi QML I tipi forniti dal modulo QtQml sono disponibili in un documento QML solo se tale documento importa lo spazio dei nomi QtQml. La versione corrente del modulo QtQml è la versione 2.11, e quindi può essere importata tramite la seguente dichiarazione: La maggior parte dei client non avrà mai bisogno di utilizzare l'importazione QtQml, poiché tutti i tipi sono forniti dallo spazio dei nomi QtQuick che può essere importato come segue: Il modulo QtQuick fornisce i tipi di oggetto più comuni necessari per creare interfacce utente in QML. Inoltre, ogni documento QML definisce implicitamente un tipo di oggetto QML, che può essere riutilizzato in altri documenti QML import QtQml 2.11 import QtQuick 2.11

QML Tipi QML Tipi base forniti nativamente dal linguaggio QML bool double enumeration int list real string url var Tipi base forniti dal modulo Qt Quick: date point rect size

QML Tipi QML Tipi oggetto forniti dal modulo Qt Quick: Component Tipo base che contiene la proprietà objectName utile per permettere alle applicazioni C++ di individuare un item di un componente QML utilizzando il metodo QObject::findChild(). Connections Un oggetto Connections crea una connessione a un segnale QML. Quando ci si collega ai segnali in QML, il modo usuale è creare un gestore "on<Signal>" che reagisce quando viene ricevuto un segnale QtObject Tipo QML incapsulato riutilizzabile con interfacce ben definite, non visuale, contenente solo la proprietà objectName. Consente essenzialmente di definire i componenti QML inline, all'interno di un documento QML, piuttosto che come un file QML separato. Ciò può essere utile per riutilizzare un piccolo componente all'interno di un file QML o per definire un componente che appartiene logicamente ad altri componenti QML all'interno di un file

QML Tipi QML Tipi oggetto forniti dal modulo Qt Quick: Item: Elemento di base assoluto. Ogni elemento QML estende l'elemento Item. Generalmente si utilizza questo elemento come elemento wrapper per pagine, schermate, finestre di dialogo, ecc. È generalmente preferito per le strutture sull'elemento Rectangle a causa della sua natura non disegnata e invisibile. Rectangle: Questo elemento è fondamentalmente un elemento Item con un riempimento colorato. È più efficiente utilizzare un Item come wrapper in quanto riduce il numero di pixel richiesti per essere disegnato; in particolare sulle viste grafiche GL in cui l'intero schermo viene ridipinto quando viene modificato un pixel. Contiene una proprietà border. Text: Permette di visualizzare il testo su una GUI. Accetta HTML come input per la proprietà text. Si deve considerare  considerare l'allineamento ogni volta che si usa Image: Questo elemento viene utilizzato per caricare un'immagine, da un file locale o da un URL. MouseArea: Questo elemento consente di inserire aree di interazione col mouse in una GUI. Il sistema Qt MouseEvent utilizza tre eventi cruciali del mouse: press, rilascio e click. Un clic è sempre composto da una sola stampante e una versione.

Qt Creator Panoramica Qt Creator

Integrare QML e C++ Tipi C++ Il modulo Qt QML fornisce classi C ++ che implementano il framework QML. I client possono utilizzare queste classi per interagire con il run-time QML (ad esempio, iniettando dati o invocando metodi sugli oggetti) e per istanziare una gerarchia di oggetti da un documento QML. Una tipica applicazione QML/C ++ crea un'istanza di un QQmlEngine e quindi utilizza un QQmlComponent per caricare un documento QML. Il motore fornisce un QQmlContext predefinito che sarà il contesto di valutazione di livello superiore utilizzato per valutare le funzioni e le espressioni definite nel documento QML. La gerarchia degli oggetti definita nel documento QML verrà istanziata chiamando la funzione create () dell'istanza QQmlComponent.

Integrare QML e C++ Tipi C++ La classe QQmlEngine fornisce un motore che può gestire una gerarchia di oggetti definita in un documento QML. Fornisce un contesto QML radice all'interno del quale vengono valutate le espressioni e garantisce che le proprietà degli oggetti vengano aggiornate correttamente quando richiesto. Fornisce un ambiente per istanziare i componenti QML. Ogni componente QML è istanziato in un QQmlContext. QQmlContext sono essenziali per il trasferimento dei dati ai componenti QML. In QML, i contesti sono disposti gerarchicamente e questa gerarchia è gestita da QQmlEngine. Prima di creare qualsiasi componente QML, un'applicazione deve aver creato un QQmlEngine per accedere a un contesto QML. QQmlEngine engine; QQmlComponent component(&engine) component.setData("import QtQuick 2.0\nItem { width: 100; height: 100}", QUrl()); QObject *object = component.create(); //Istanzia l’oggetto object->setProperty("width", 500);

Integrare QML e C++ Tipi C++ La classe QQmlContext La classe QQmlContext fornisce un contesto per l'istanziazione degli oggetti e la valutazione delle espressioni. Tutti gli oggetti sono istanziati in un particolare contesto e tutte le espressioni vengono valutate all'interno di un particolare contesto. Questo contesto definisce come vengono risolti i simboli, e quindi su quali valori opera l'espressione. Ogni QQmlContext contiene un insieme di proprietà, distinte dalle sue proprietà QObject, che consentono ai dati di essere esplicitamente associati a un contesto per nome. Le proprietà del contesto vengono definite e aggiornate chiamando QQmlContext :: setContextProperty(). QQmlEngine engine; QString dummyString = "Hello World"; QQmlContext *context = new QQmlContext(engine.rootContext()); context->setContextProperty("myString", dummyString ); QQmlComponent component(&engine) component.setData("import QtQuick 2.0\nText { text: myString} ", QUrl()); QObject *object = component.create(context);

Integrare QML e C++ Tipi C++ La classe QQmlComponent La classe QQmlComponent può essere utilizzata per caricare un documento QML. La classe QQmlComponent incapsula una definizione del componente QML. Un'istanza QQmlComponent può essere creata da un file QML Richiede un QQmlEngine per creare un'istanza della gerarchia di oggetti definita nel documento QML. QQmlEngine *engine = new QQmlEngine (); QQmlComponent component(&engine); component.setData("import QtQuick 2.0\nItem { width: 200 height: 200}", QUrl()); QObject *myObject = component.create(); QQuickItem *item = qobject_cast<QQuickItem*>(myObject); int width = item->width(); // width = 200

Integrare QML e C++ Le applicazioni QML spesso devono gestire funzionalità più avanzate in C ++. Il modo più comune e più rapido per farlo è esporre le classi C ++ al QML, a condizione che l'implementazione C ++ sia derivata da QObject. QML può essere facilmente esteso con funzionalità definite nel codice C ++. A causa della stretta integrazione del motore QML con il meta- object system di Qt, qualsiasi funzionalità che sia esposta in modo appropriato da una classe derivata da QObject è accessibile dal codice QML. Ciò consente ai dati e alle funzioni C ++ di essere accessibili direttamente da QML.

Integrare QML e C++ L'integrazione di QML e C ++ offre una varietà di opportunità, tra cui la possibilità di: Separare il codice dell'interfaccia utente dal codice logico dell'applicazione, implementando il primo con QML e JavaScript nei documenti QML e quest'ultimo con C ++ Utilizzare e richiamare alcune funzionalità C ++ da QML (ad esempio, per richiamare la logica dell'applicazione, utilizzare un modello dati implementato in C ++ o chiamare alcune funzioni in una libreria C ++ di terze parti) Accedere all’ API Qt QML o Qt Quick C ++ (ad esempio, per generare dinamicamente immagini utilizzando QQuickImageProvider) Implementare i propri tipi di oggetto QML da C ++, sia per l'uso all'interno della tua specifica applicazione, sia per la distribuzione ad altri

Integrare QML e C++ Qualsiasi codice QML può accedere ai seguenti membri di un'istanza di una classe derivata da QObject: Proprietà definite utilizzando la macro Q_PROPERTY() Metodi (a condizione che siano slot pubblici o contrassegnati con Q_INVOKABLE) Segnali enum se dichiarati con Q_ENUMS

Integrare QML e C++ In generale, questi sono accessibili da QML indipendentemente dal fatto che una classe derivata da QObject sia stata registrata con il sistema di tipi QML. Tuttavia, se una classe deve essere utilizzata in un modo che richiede al motore di accedere ad ulteriori informazioni sul tipo - ad esempio, se la classe stessa deve essere utilizzata come parametro o proprietà del metodo, o se uno dei suoi tipi di enum deve essere usato in questo modo - la classe potrebbe aver bisogno di essere registrata. Una classe derivata da QObject può essere registrata con il sistema di tipi QML per abilitare il tipo da utilizzare come tipo di dati dal codice QML. La registrazione di un tipo istanziabile consente di utilizzare una classe C ++ come definizione di un tipo di oggetto QML e consente di utilizzare il tipo come tipo di dati per valori di proprietà, parametri di metodo, valori di ritorno e parametri di segnale scambiati tra QML e C ++. Per registrare una classe derivata da QObject come un tipo di oggetto QML, bisogna chiamare qmlRegisterType () per registrare la classe come tipo QML in un particolare spazio dei nomi di tipo. I client possono quindi importare tale spazio dei nomi per poter utilizzare il tipo.

Integrare QML e C++ Esporre le proprietà È possibile specificare una proprietà per qualsiasi classe derivata da QObject utilizzando la macro Q_PROPERTY (). Una proprietà è un membro dati di classe con una funzione di lettura associata e una funzione di scrittura facoltativa. Tutte le proprietà di una classe derivata da QObject sono accessibili da QML. Per la massima interoperabilità con QML, qualsiasi proprietà che sia scrivibile dovrebbe avere un segnale NOTIFY associato che viene emesso ogni volta che il valore della proprietà è cambiato. Ciò consente alla proprietà di essere utilizzata con l'associazione di proprietà, che è una caratteristica essenziale di QML che applica le relazioni tra proprietà aggiornando automaticamente una proprietà ogni volta che una qualsiasi delle sue dipendenze cambia in valore.

Integrare QML e C++ Esporre metodi e segnali Qualsiasi metodo di un tipo derivato da QObject è accessibile dal codice QML se è: Un metodo pubblico contrassegnato con la macro Q_INVOKABLE () Un metodo che è una slot Qt pubblica Qualsiasi segnale pubblico di un tipo derivato da QObject è accessibile dal codice QML. Il motore QML crea automaticamente un gestore di segnale per qualsiasi segnale di un tipo derivato da QObject utilizzato da QML. I gestori di segnale sono sempre nominati on<Signal> dove <Signal> è il nome del segnale, con la prima lettera maiuscola. Tutti i parametri passati dal segnale sono disponibili nel gestore di segnali attraverso i nomi dei parametri.

Integrare QML e C++ Caricare oggetti QML da C++ Un documento QML può essere caricato con QQmlComponent o QQuickView. QQmlComponent carica un documento QML come un oggetto C ++ che può quindi essere modificato dal codice C ++. QQuickView fa lo stesso, ma poiché è una classe derivata da QWindow, anche l'oggetto caricato sarà un oggetto grafico; QQuickView viene generalmente utilizzato per integrare un oggetto QML visualizzabile nell'interfaccia utente di un'applicazione. // Using QQmlComponent QQmlEngine engine; QQmlComponent component(&engine, QUrl::fromLocalFile("MyItem.qml")); QObject *object = component.create(); ... delete object; // Using QQuickView QQuickView view; view.setSource(QUrl::fromLocalFile("MyItem.qml")); view.show(); QObject *object = view.rootObject();

Integrare QML e C++ Caricare oggetti QML da C++ Una volta che un’ istanza del componente è stata creata è possibile accederne alle proprietà ad esempio utilizzando QObject::setProperty() o QQmlProperty::write() object->setProperty("width", 500); QQmlProperty(object, "width").write(500); // Modifica il binding I componenti QML sono essenzialmente alberi oggetto con figli che hanno fratelli e figli. Gli oggetti dei componenti QML possono essere individuati utilizzando la proprietà QObject :: objectName con QObject :: findChild (). Tutti i segnali QML sono automaticamente disponibili in C ++ e possono essere collegati usando QObject :: connect () come qualsiasi normale segnale Qt C

Integrare QML e C++ Plugin C++ per QML Il motore QML carica i plugin C ++ per QML. Tali plugin sono solitamente forniti in un modulo di estensione QML e possono fornire tipi di utilizzo da parte dei clienti nei documenti QML che importano il modulo. Un modulo richiede almeno un tipo registrato per essere considerato valido. QQmlExtensionPlugin è un'interfaccia plugin che consente di creare estensioni QML che possono essere caricate dinamicamente in applicazioni QML. Queste estensioni consentono ai tipi QML personalizzati di essere resi disponibili al motore QML.   Per scrivere un plugin per l'estensione QML: Creare una sottoclasse di QQmlExtensionPlugin Usare la macro Q_PLUGIN_METADATA () per registrare il plugin con il meta-object system di Qt Ridefinire il metodo registerTypes () e chiamare qmlRegisterType () per registrare i tipi da esportare dal plugin Scrivere un file di progetto per il plugin Creare un file qmldir per descrivere il plugin