申报QML全球房地产其他QML文件(declare global property in QML f

2019-07-21 02:42发布

我想在配置文件中声明一个全局性和其他文件中使用它。 例如声明mainbg中:

Style.qml:

property color mainbg: 'red'

而在其他QML文件(如使用view.qmlmain.qml )。 我该怎么做工作?

Answer 1:

使用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文件)。



Answer 2:

基本上,如果你不需要属性绑定(如果值是一个常数,不会需要是在变化呈报),你可以在JavaScript共享库定义它,就像这样:

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

而在QML像这样使用它:

import "MyConstants.js" as Constants

Rectangle {
     color: Constants.mainbg;
}

但这样做的不好的一面是: - 没有强类型(JS并不真正了解的类型),所以你可以把任何东西,即使它是不是一种颜色。 -如果你改变mainbg ,使用它的项目不会被通知的变化,并会保留旧值

所以,如果你需要的类型检查,并结合/变更通知,只是声明你的财产作为根对象的成员在你main.qml,这将是访问来自世界各地的QML应用程序,因为属性实际上将直接登记到上下文设为Qml对象,这是定义全球。

希望能帮助到你。



Answer 3:

您可以创建一个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
  }
}


Answer 4:

加入一些有助于@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以供参考。



Answer 5:

在主要添加这个属性,你可以在任何QML访问它,这可能不是正确的方式,但这个工程。

或者,如果你想组的属性添加他们在一个QML包括QML主并给出一个ID,现在你可以使用该ID访问这个属性

main.qml

 Item{
 width:10
 height:10

 Model{
 id:globdldata
 }



 }

Model.qml

Item {

property color mainbg: 'red'

}

你可以在任何地方使用globdldata.mainbg



Answer 6:

你总是可以创建一个包含要跨QML文件共享属性的新QML对象文件。 只需导入它就像任何QML对象相同的方式,你可以访问性能。 现在,如果你希望能够修改这些特性,并具有跨实例共享的东西的变化得到了很多麻烦,你很可能要诉诸某种使用.pragma库js文件的解决方案。 除非你想写某种C ++替代的。



文章来源: declare global property in QML for other QML files