declarar propiedad global en QML para otros archivos QML

Quiero declarar una propiedad global en un archivo de configuración y usarlo en otros archivos. por ejemplo, declarar mainbg en:

Style.qml :

 property color mainbg: 'red' 

y usarlo en otros archivos QML (como view.qml y main.qml ). ¿Cómo puedo hacer este trabajo?

Use un QML Singleton.

Haga referencia al “Enfoque 2” en esta página : los feos comentarios de QTBUG-34418 son míos.

Estas son las piezas que necesitas:

Style.qml

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

qmldir

Este archivo debe estar en la misma carpeta que el archivo singleton .qml ( Style.qml en nuestro ejemplo) o debe darle una ruta de acceso relativa. qmldir también puede necesitar ser incluido por el archivo de recursos .qrc. Puede encontrar más información sobre los archivos qmldir aquí .

 # qmldir singleton Style Style.qml 

Cómo hacer referencia

 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 } 

Este enfoque está disponible desde Qt5.0. Necesita una statement de import carpeta incluso si hace referencia al singleton QML en la misma carpeta. Si es la misma carpeta, use: import "." Este es el error que documenté en la página qt-project (vea QTBUG-34418, los singletons requieren importación explícita para cargar el archivo qmldir).

Básicamente, si no necesita enlace de propiedad (si el valor es una constante y no será necesario notificar el cambio), puede definirlo en una biblioteca compartida de JavaScript, como esta:

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

Y úsalo en QML así:

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

Pero el lado malo de esto es: – no hay tipeo fuerte (JS realmente no sabe acerca de los tipos) por lo que podría poner cualquier cosa, incluso si no es un color. – y si cambia mainbg , el artículo que lo usa no será notificado sobre el cambio y mantendrá el valor anterior

Por lo tanto, si necesita verificación de tipo y enlace / notificación de cambio, simplemente declare su propiedad como miembro del objeto raíz en main.qml y podrá acceder a ella desde cualquier lugar de la aplicación QML, ya que la propiedad se registrará directamente en el objeto Contexto Qml, que es global por definición.

Espero eso ayude.

Puede crear un archivo js e importarlo a todos los archivos que tienen que usar esta propiedad.

archivo js:

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

archivo 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 } } 

Agregando algunos contribuir a la respuesta @pixelgrease, encontré otra técnica que no requiere la import "." relativa de ruta import "." , solucionando el error QTBUG-34418 . Esto es útil especialmente si uno tiene qmldir y singleton en un lugar diferente que el archivo qml donde se utiliza el singleton. La técnica requiere definir un módulo apropiado dentro de la estructura de árbol: el módulo se resuelve agregando la ruta primaria del módulo al motor QML con QmlEngine::addImportPath(moduleParentPath) . Por ejemplo:

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

En main.cpp tienes entonces:

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

Si usa recursos, qml.qrc:

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

En qmldir:

 module MySingletons singleton MySingleton 1.0 MySingleton.qml 

En main.qml, o cualquier otro archivo qml en un directorio diferente:

 import MySingletons 1.0 

Luego usas la clase MySingleton como de costumbre. Adjunté el ejemplo MySingletonWithModule.7z al error QTBUG-34418 para referencia.

Agregue esta propiedad en main y puede acceder a ella en cualquier qml, esta puede no ser la forma correcta, pero esto funciona.

o si quieres agrupar la propiedad, agrégalas en un qml, incluye ese qml en main y da una identificación, ahora puedes acceder a esta propiedad usando esa identificación

main.qml

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

Model.qml

 Item { property color mainbg: 'red' } 

puedes usar globdldata.mainbg en cualquier lugar

Siempre puede crear un nuevo archivo de objeto QML que contenga las propiedades que desea compartir en los archivos qml. Simplemente importe de la misma forma que lo haría con cualquier objeto QML y tendrá acceso a las propiedades. Ahora, si desea poder modificar estas propiedades y hacer que los cambios se compartan entre instancias, las cosas se vuelven mucho más complicadas y lo más probable es que desee recurrir a algún tipo de solución utilizando los archivos js de la biblioteca .pragma. A menos que quieras escribir algún tipo de alternativa C ++.