我想在配置文件中声明一个全局性和其他文件中使用它。 例如声明mainbg
中:
Style.qml:
property color mainbg: 'red'
而在其他QML文件(如使用view.qml
和main.qml
)。 我该怎么做工作?
我想在配置文件中声明一个全局性和其他文件中使用它。 例如声明mainbg
中:
Style.qml:
property color mainbg: 'red'
而在其他QML文件(如使用view.qml
和main.qml
)。 我该怎么做工作?
使用QML辛格尔顿。
请参考“办法2”在本页面 -丑陋的QTBUG-34418的意见是我的。
这些都是你需要的部分:
Style.qml
pragma Singleton
import QtQuick 2.0
QtObject {
property color mainbg: 'red'
}
qmldir
此文件必须在同一文件夹中的单身.qml文件( Style.qml
在我们的例子),或者必须给出相对路径。 qmldir
可能还需要由.qrc资源文件包括在内。 有关qmldir文件的更多信息,可以发现在这里 。
# qmldir
singleton Style Style.qml
如何引用
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
}
这种方法是可用的,因为Qt5.0。 你需要一个文件夹import
,即使引用在同一文件夹中的QML单身声明。 如果是同一个文件夹,使用: import "."
这是我的QT-项目页面上记录的bug(见QTBUG-34418,单身人士需要明确的进口加载qmldir文件)。
基本上,如果你不需要属性绑定(如果值是一个常数,不会需要是在变化呈报),你可以在JavaScript共享库定义它,就像这样:
// MyConstants.js
.pragma library
var mainbg = "red";
而在QML像这样使用它:
import "MyConstants.js" as Constants
Rectangle {
color: Constants.mainbg;
}
但这样做的不好的一面是: - 没有强类型(JS并不真正了解的类型),所以你可以把任何东西,即使它是不是一种颜色。 -如果你改变mainbg
,使用它的项目不会被通知的变化,并会保留旧值
所以,如果你需要的类型检查,并结合/变更通知,只是声明你的财产作为根对象的成员在你main.qml,这将是访问来自世界各地的QML应用程序,因为属性实际上将直接登记到上下文设为Qml对象,这是定义全球。
希望能帮助到你。
您可以创建一个js文件,并将其导入到所有要使用这个属性的文件。
js文件:
//Note: you only need '.pragma library' if you are planning to
//change this variable from multiple qml files
.pragma library
var globalVariable = 20;
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
}
}
加入一些有助于@pixelgrease答案,我发现,不需要路径相对的另一种技术import "."
,workarounding错误QTBUG-34418 。 这是有用的,特别是如果一个人qmldir
和单件类在不同的地方比使用单件的QML文件。 该技术需要定义了树结构内的适当的模块:该模块然后通过加入到QML发动机与模块的父路径解决QmlEngine::addImportPath(moduleParentPath)
例如:
qml/
├── <ModuleName>/
│ ├── <ClassName>.qml
│ ├── qmldir
在main.cpp中你有那么:
QQmlApplicationEngine engine;
engine.addImportPath("qrc:/qml"); // Can be any directory
engine.load("qrc:/qml/main.qml");
如果你使用的资源,qml.qrc:
<RCC>
<qresource prefix="/">
(...)
<file>qml/main.qml</file>
<file>qml/MySingletons/MySingleton.qml</file>
<file>qml/MySingletons/qmldir</file>
</qresource>
</RCC>
在qmldir:
module MySingletons
singleton MySingleton 1.0 MySingleton.qml
在main.qml,或者在不同的目录中的任何其他文件QML:
import MySingletons 1.0
然后你使用MySingleton类如常。 我连接的例子MySingletonWithModule.7z于错误QTBUG-34418以供参考。
在主要添加这个属性,你可以在任何QML访问它,这可能不是正确的方式,但这个工程。
或者,如果你想组的属性添加他们在一个QML包括QML主并给出一个ID,现在你可以使用该ID访问这个属性
main.qml
Item{
width:10
height:10
Model{
id:globdldata
}
}
Model.qml
Item {
property color mainbg: 'red'
}
你可以在任何地方使用globdldata.mainbg
你总是可以创建一个包含要跨QML文件共享属性的新QML对象文件。 只需导入它就像任何QML对象相同的方式,你可以访问性能。 现在,如果你希望能够修改这些特性,并具有跨实例共享的东西的变化得到了很多麻烦,你很可能要诉诸某种使用.pragma库js文件的解决方案。 除非你想写某种C ++替代的。