variables - declarar propiedad global en QML para otros archivos QML
global-variables scope (6)
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/
├── <ModuleName>/
│ ├── <ClassName>.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:
<RCC>
<qresource prefix="/">
(...)
<file>qml/main.qml</file>
<file>qml/MySingletons/MySingleton.qml</file>
<file>qml/MySingletons/qmldir</file>
</qresource>
</RCC>
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.
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?
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
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
}
}
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 ++.
Use un QML Singleton.
Haga referencia al "Enfoque 2" en esta página : los feos 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 here .
# 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 declaración 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).