mainbg
in:
Style.qml
:
property color mainbg: 'red'
在其他QML文件中使用它(例如view.qml
和
main.qml
)。我该怎么做?
使用QML Singleton。
评论是我的。 这些是您需要的部分:
风格。qml
pragma Singleton
import QtQuick 2.0
QtObject {
property color mainbg: 'red'
}
th这个文件必须与Singleton .QML文件(在我们的示例中)处于同一文件夹中,否则您必须给它一个相对路径。 .QRC资源文件也可能需要包括。有关qmldir文件的更多信息,可以找到here。
Style.qml
如何参考
qmldir
自QT5.0以来,这种方法可用。即使在同一文件夹中引用QML Singleton,您也需要一个文件夹
# 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
}
这是我在QT-Project页面上记录的错误(请参阅qtbug-34418,单例需要显式导入以加载qmldir文件)。
基本上,如果您不需要属性绑定(如果您的价值是常数,则不需要在更改上注意),则可以在JavaScript共享库中定义它,例如:
import
在QML中使用它:
import "."
但不好的一面是:
- 没有强大的打字(JS真的不知道类型),因此即使不是颜色,也可以放任何东西。
- 如果更改
// MyConstants.js
.pragma library
var mainbg = "red";
,则不会通知使用它的项目,并将保持旧值
因此,如果您需要类型检查和绑定/更改通知,只需将您的属性声明为您的root对象。注册到QML上下文对象中,该对象是全局的。
希望它有帮助
您可以创建JS文件并将其导入到必须使用此属性的所有文件中。JS文件:
QML文件:
mainbg
添加一些有助于@pixelgrease的答案,我找到了另一种不需要路径相关路径的技术,可以解决bugqtbug-34418
。这很有用,尤其是如果一个人在与使用单例的QML文件不同的位置上有
//Note: you only need '.pragma library' if you are planning to
//change this variable from multiple qml files
.pragma library
var globalVariable = 20;
和单顿类。该技术需要在树结构内定义一个适当的模块:然后通过将模块的父路径添加到QML发动机的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
}
}
在main.cpp中,您有:
如果您使用资源,qml.qrc:
qmldir
在qmldir:
QmlEngine::addImportPath(moduleParentPath)
在main.qml或其他目录中的任何其他QML文件:
然后您照常使用mysingleton课程。我将示例mysingletonwithmodule.7z附加到bug
qtbug-34418进行参考。
在Main中添加此属性,您可以在任何QML中访问它,这可能不是正确的方法,但可以使用此属性。或如果要分组属性,将它们添加到QML中 将该QML包含在MAIN中并给出ID,现在您可以使用该ID
访问此属性。main.qml
QQmlApplicationEngine engine;
engine.addImportPath("qrc:/qml"); // Can be any directory
engine.load("qrc:/qml/main.qml");
model.qml
<RCC>
<qresource prefix="/">
(...)
<file>qml/main.qml</file>
<file>qml/MySingletons/MySingleton.qml</file>
<file>qml/MySingletons/qmldir</file>
</qresource>
</RCC>
您可以在任何地方使用globdldata.mainbg从QT 6.2开始使用CMAKE,有属性
QT_QML_SINGLETON_TYPE
,它允许轻松使用QML单例无需任何import和qmldir。如果您有STYLE.QML
module MySingletons
singleton MySingleton 1.0 MySingleton.qml
将此额外的属性设置在Cmakelist.txt
中在其他文件中使用
Item{
width:10
height:10
Model{
id:globdldata
}
}
您始终可以创建一个新的QML对象文件,该文件包含您想要在QML文件中共享的属性。 只需按照任何QML对象的方式导入它,并且您可以访问属性。现在,如果您想能够修改这些属性并在实例中共享的更改变得更加棘手,您很可能希望使用.pragma库JS文件求助于某种解决方案。 除非您想编写某种C ++替代方案。