2013-08-13 14 views
7

Considerare il caso di una semplice GUI che visualizza l'output di un calcolo piuttosto elaborato.QML nell'app C++ o viceversa

Ora mi piacerebbe scrivere una bella interfaccia utente personalizzata utilizzando QML.
Vorrei anche scrivere la mia app in background in QT C++.

Sono seduto davanti alla documentazione di QT e mi chiedo se
1) deve scrivere un'applicazione QML e in qualche modo incorporare le classi C++ in esso (che è assolutamente possibile) o se io
2) deve scrivere un applicazione C++ e in qualche modo incorporare la GUI QML in esso e modificare le proprietà QML dalle mie classi (che è di nuovo possibile)

ho già scritto tutto in C++ utilizzando QT Widget per la GUI. Voglio solo spostare la GUI in QML e mantenere le classi C++ anche se sono disposto a riscrivere l'interfaccia sulla GUI.

Possibile Anser:

La soluzione marcata sotto suggerito mantenere il C++ le classi e l'interfaccia GUI esclusivamente attraverso segnali e slot. Quindi, in pratica ho finito con un main.cpp che crea un'istanza mia classe principale di lavoro e visualizza l'interfaccia grafica QML come questo:

QQuickView viewer; 
viewer.setSource(QUrl("./qml/main.qml")); 
viewer.show(); 

poi ho aggiunto myClass e mi ha fatto un oggetto per fare i collegamenti:

MyClass myClass; 
QQuickItem* item = viewer.rootObject(); 
QObject::connect(item, SIGNAL(buttonClicked()), &myClass, SLOT(mySlot())); 
QObject::connect(&myClass, SIGNAL(mySignal(QVariant)), item, SLOT(updateGUI(QVariant))); 

Quando si implementano gli slot e i segnali nelle classi C++, è necessario utilizzare oggetti QVariant per trasferire i dati. Il file QML implementa quindi SIGNALS, ad es. per i pulsanti cliccati e SLOT per ricevere i dati da visualizzare.

Questo è esattamente quello che speravo. L'unica modifica al mio codice non GUI era di fare tutte le interazioni tramite SEGNALI e SLOT. Ora posso persino usare entrambe le GUI (QML/Widget) per la mia applicazione.

+1

Ho aggiunto una risposta completa. Ho anche spiegato perché questa è una buona domanda con una soluzione valida. – HWende

+0

Correlati: [Qt Designer C++ o QML per GUI] (http://stackoverflow.com/q/4610073/514235) – iammilind

risposta

7

Basta scrivere la logica di base in C++, interfacciarlo con segnali e slot e puoi utilizzare lo stesso componente con i widget e anche con QML.

Non è scienza missilistica, la logica C++ consente l'utilizzo con C++ e QML, logica JS - solo QML. C++ e Qt API sono la soluzione più solida, perché da JS non si ha realmente accesso a tanta funzionalità delle API Qt, solo pochi metodi sono "portati" nel mondo QML. Ma tutti i contenitori di dati ad alte prestazioni e le prestazioni di esecuzione si trovano in C++.

Se è necessario visualizzare solo i risultati e la console non è sufficiente, preferirei mantenere QtWidgets, perché l'aggiunta del modulo dichiarativo rallenta notevolmente la compilazione. Il modulo widget è autonomo ora, quindi aggiungi il modulo "extra" anche con QtWidgets (in Qt4 faceva parte di QtGui) ma è più leggero.Dopo aver utilizzato i widget per la prototipazione della logica principale, è possibile implementare un'interfaccia QML e collegarla ai segnali/slot/proprietà e associazioni esistenti che li utilizzano.

E no, non si incorpora QML in classi C++, è il contrario, C++ è il livello di livello più basso, che viene utilizzato per creare componenti QML. Per quanto riguarda l'istanziazione effettiva, è possibile procedere in entrambi i modi: se si registra una classe basata su QObject sul motore QML, è possibile creare un'istanza in QML. Oppure puoi istanziare la classe in C++ e renderla disponibile solo nel contesto QML - non ha molta importanza. Se hai bisogno di un singolo oggetto, è meglio istanziarlo in C++ nella funzione main() e renderlo disponibile nel contesto QML, se si tratta di componenti che si intende creare un'istanza di un lotto, quindi creare un componente QML.

È possibile prototipare la logica di base con JS in QML e successivamente portarlo in C++, se lo si desidera. Sembra il doppio dello sforzo, ma se fai il tuo letto giusto è in realtà un aumento della produttività, perché la prototipazione è molto più veloce in QML, la cattura degli errori è molto più sicura e informativa, e se fai bene la tua API, esegui il porting del codice JS a C++ è di solito un piccolo inconveniente - sostituire alcuni var s con tipi di cemento, sostituire alcuni . con -> e cose del genere.

Qualsiasi "calcolo elaborato" che desideri REALMENTE fare in C++. Ogni volta che il calcolo è completato, puoi semplicemente emetterlo come un segnale e visualizzare automaticamente il risultato in qualunque slot sia collegato il segnale, sia che sia in un widget o in QML, o anche entrambi allo stesso tempo.

+0

Sembra che tu abbia ragione. Ho capito come farlo in una piccola demo e si adatta perfettamente alle mie esigenze. Lo scambio di informazioni con i segnali (ad esempio dalle interazioni GUI) e gli slot è facile e mi piace che io possa "collegare" lo sfondo a diverse GUI in questo modo. Il file QML fornisce alcuni slot per ricevere tutto da visualizzare e il gioco è fatto. Grazie! – HWende

+0

@HWende - siete i benvenuti, vedere la mia ultima modifica riguardante l'istanza effettiva della classe C++. Vedi questa risposta se hai bisogno di aiuto con l'istanziazione e la registrazione delle classi C++ su QML: http://stackoverflow.com/questions/16002310/qml-how-to-draw-multiple-rectangulars-in-random-places/16004056# 16004056 – dtech

0

Questo è molto basato sull'opinione. Nessuna risposta "vera" possibile. Per me è 'più facile' scrivere in QML e 'estendere' qml con i plugin Qt. Questo perché ho fatto un grande progetto in questo modo. Altri potrebbero avere altre esperienze e potrebbero a causa di questo come un approccio diverso. Nessuna delle nostre "storie di vita" potrebbe aiutarti molto.

+0

È molto probabile che un metodo sia più facilmente realizzabile se non ho esperienza in entrambi i modi. Un metodo è probabilmente più "principiante" e qualcuno che conosce entrambi i metodi potrebbe sapere quale. Proviamolo! – HWende

+0

Non si basa sull'opinione, è basata sull'esperienza, sulla logica e sulla ragione. Una delle opzioni è chiaramente controproducente e un approccio cattivo, l'altra è la buona pratica raccomandata. -1 per etichettarlo con "nessuna risposta vera possibile" ... – dtech

+0

Se lo dici tu. La mia opinione: sciocchezze. Ogni progetto è diverso. Ogni gui è diverso. Spiegare qui quando un approccio è migliore dell'altro potrebbe riempire i libri. Hai un'interfaccia utente grande e complicata? Solo alcuni controlli standard? Quale approccio è giusto, deve essere deciso per ogni nuovo progetto. Dipende non solo da puri motivi tecnici, ma anche dall'esperienza tecnica della tua squadra. Hanno esperienza di più in C++ o in qml? Hanno tempo per entrare in nuovi concetti? – Greenflow

Problemi correlati