Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
1
Introduzione a QML e integrazione con il C++
2
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
3
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
4
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
5
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.
6
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
7
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
8
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
9
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
10
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
11
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
12
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)
13
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
14
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.
15
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
16
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
17
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
18
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.
19
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
20
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
21
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.
22
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.
23
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
24
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
25
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.
26
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: // ... };
27
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(); };
28
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)
29
QML SINTASSI DI BASE Attaching properties – Attaching type QML C++
Message { author: "Amelie" creationDate: new Date() MessageBoard.expired: creationDate < new Date("January 01, :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();
30
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
31
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.
32
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.
33
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
34
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
35
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
36
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.
37
Qt Creator Panoramica Qt Creator
38
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.
39
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);
40
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);
41
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
42
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.
43
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
44
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
45
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.
46
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.
47
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.
48
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();
49
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
50
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
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.