dichiarare la proprietà globale in QML per altri file QML

Voglio dichiarare una proprietà globale in un file di configurazione e usarla in altri file. per esempio dichiarare mainbg in:

Style.qml :

 property color mainbg: 'red' 

e usarlo in altri file QML (come view.qml e main.qml ). Come posso fare questo lavoro?

Utilizzare un QQ Singleton.

Si prega di fare riferimento a “Approach 2” in questa pagina – I brutti commenti di QTBUG-34418 sono miei.

Questi sono i pezzi che ti servono:

Style.qml

 pragma Singleton import QtQuick 2.0 QtObject { property color mainbg: 'red' } 

qmldir

Questo file deve trovarsi nella stessa cartella del file .qml singleton ( Style.qml nel nostro esempio) oppure devi fornire un percorso relativo. qmldir potrebbe anche dover essere incluso dal file di risorse .qrc. Ulteriori informazioni sui file qmldir sono disponibili qui .

 # qmldir singleton Style Style.qml 

Come riferimento

 import QtQuick 2.0 import "." // this is needed when referencing singleton object from same folder Rectangle { color: Style.mainbg // <- there it is!!! width: 240; height 160 } 

Questo approccio è disponibile da Qt5.0. È necessaria una dichiarazione di import cartelle anche se si fa riferimento al singleton QML nella stessa cartella. Se è la stessa cartella, utilizzare: import "." Questo è il bug che ho documentato sulla pagina del qt-project (vedi QTBUG-34418, i singleton richiedono un'importazione esplicita per caricare il file qmldir).

Fondamentalmente, se non hai bisogno di un bind di proprietà (se il tuo valore è una costante e non sarà necessario notificarlo in caso di modifica) puoi definirlo in una libreria condivisa Javascript, come questa:

 // MyConstants.js .pragma library var mainbg = "red"; 

E usalo in QML come questo:

 import "MyConstants.js" as Constants Rectangle { color: Constants.mainbg; } 

Ma il lato negativo di questo è: – nessuna tipizzazione forte (JS non conosce davvero i tipi) in modo da poter inserire qualcosa anche se non è un colore. – e se cambi mainbg , l’Item che lo usa non verrà informato della modifica e manterrà il vecchio valore

Quindi, se hai bisogno di controllo dei tipi e di binding / change notify, dichiara semplicemente la tua proprietà come membro dell’object root nel tuo main.qml, e sarà accessibile da ogni parte dell’applicazione QML, poiché la proprietà verrà infatti registrata direttamente nell’object Contesto Qml, che è globale per definizione.

Spero che sia d’aiuto.

È ansible creare un file js e importarlo in tutti i file che devono utilizzare questa proprietà.

file js:

 //Note: you only need '.pragma library' if you are planning to //change this variable from multiple qml files .pragma library var globalVariable = 20; 

file qml:

 import "test.js" as Global Rectangle { id: main width: 300; height: 400 Component.onCompleted: { console.log( Global.globalVariable) //you can also change it Global.globalVariable = 5 } } 

Aggiungendo un po ‘di contributo alla risposta @pixelgrease, ho trovato un’altra tecnica che non richiede l’ import "." relativa del percorso import "." , soluzione al bug QTBUG-34418 . Questo è utile specialmente se uno ha qmldir e singleton in un posto diverso dal file qml in cui viene usato il singleton. La tecnica richiede la definizione di un modulo appropriato all’interno della struttura ad albero: il modulo viene quindi risolto aggiungendo il percorso genitore del modulo al motore QML con QmlEngine::addImportPath(moduleParentPath) . Per esempio:

 qml/ ├── / │ ├── .qml │ ├── qmldir 

In main.cpp hai quindi:

 QQmlApplicationEngine engine; engine.addImportPath("qrc:/qml"); // Can be any directory engine.load("qrc:/qml/main.qml"); 

Se si utilizzano le risorse, qml.qrc:

   (...) qml/main.qml qml/MySingletons/MySingleton.qml qml/MySingletons/qmldir   

In qmldir:

 module MySingletons singleton MySingleton 1.0 MySingleton.qml 

In main.qml o qualsiasi altro file qml in una directory diversa:

 import MySingletons 1.0 

Quindi usi la class MySingleton come al solito. Ho allegato l’esempio MySingletonWithModule.7z al bug QTBUG-34418 come riferimento.

Aggiungi questa proprietà in main e puoi accedervi in ​​qualsiasi qml, questo potrebbe non essere il modo corretto ma funziona.

o se vuoi raggruppare la proprietà aggiungili in un qml includi qml in main e fornisci un id, ora puoi accedere a questa proprietà usando quell’id

main.qml

  Item{ width:10 height:10 Model{ id:globdldata } } 

Model.qml

 Item { property color mainbg: 'red' } 

puoi usare globdldata.mainbg ovunque

È sempre ansible creare un nuovo file object QML che contenga le proprietà che si desidera condividere tra file qml. Basta importarlo nello stesso modo in cui si farebbe con qualsiasi object QML e si ha accesso alle proprietà. Ora, se vuoi essere in grado di modificare queste proprietà e avere le modifiche condivise tra le varie istanze, le cose diventano molto più complicate e molto probabilmente vorrai ricorrere a qualche tipo di soluzione usando i file js della libreria .pragma. A meno che tu non voglia scrivere una sorta di alternativa al C ++.