将其他QML文件中的QML全局属性删除

问题描述 投票:0回答:5
我想在配置文件中声明全局属性,然后在其他文件中使用它。例如,声明

mainbg

in:

Style.qml

property color mainbg: 'red'
在其他QML文件中使用它(例如

view.qml

main.qml
)。
我该怎么做?

使用QML Singleton。
qt variables scope qml global-variables
5个回答
55
投票
qtbug-34418

评论是我的。 这些是您需要的部分:

风格。qml pragma Singleton import QtQuick 2.0 QtObject { property color mainbg: 'red' }

qmldir

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文件:


29
投票

QML文件:

mainbg

添加一些有助于@pixelgrease的答案,我找到了另一种不需要路径相关路径的技术,可以解决bug
qtbug-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中,您有:


22
投票

如果您使用资源,qml.qrc:

qmldir

在qmldir:

QmlEngine::addImportPath(moduleParentPath)

在main.qml或其他目录中的任何其他QML文件:

9
投票

然后您照常使用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


3
投票

在其他文件中使用

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

您始终可以创建一个新的QML对象文件,该文件包含您想要在QML文件中共享的属性。 只需按照任何QML对象的方式导入它,并且您可以访问属性。现在,如果您想能够修改这些属性并在实例中共享的更改变得更加棘手,您很可能希望使用.pragma库JS文件求助于某种解决方案。 除非您想编写某种C ++替代方案。
	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.