QML:id的范围

时间:2016-09-06 18:37:15

标签: qt scope qml

假设我创建了一个标识为foo的对象。名称foo可见对象多远?当前文件中到处都是?目前的目录中到处都是?或者是什么?

我在scope上阅读了QML文档,但我没有在那里找到相关信息。

2 个答案:

答案 0 :(得分:1)

我在id attribute documentation找到了答案。

它说:

  

对象可以通过其id组件范围中的任何位置引用。

和"组件范围"在the scope documentation page

中定义

答案 1 :(得分:1)

使用id来引用单一来源中的对象是完美的,花花公子,但故事还有更多内容。 id也将解析对象树:

ApplicationWindow {
  id: main
  visible: true
  width: 600
  height: 300

  property int test: 667

  Obj { }
}

// Obj.qml
Item {
  Obj2 {}
}

// Obj2.qml
QtObject {
  Component.onCompleted: console.log(main.test)
}

正如此示例所示,main id来自在Obj2中创建的Objmain.qml创建的id。在这方面,id非常类似于动态范围属性,有一个值得注意的例外,动态范围属性只有在特定源的根对象中声明时才有效,而someObject.someDynamicScopeProperty无论哪个对象都会解析它被声明,只要它在那个源中,当然,只要它没有被遮蔽。我猜在内部他们最终会转移到根对象,因为它们成为该组件的属性。通用逻辑规定查找性能类似于动态属性。为了进一步强化与动态范围属性的相似性,两者都不可能链接,只能从特定的qml文件中解析。即使someObject.someId内的属性和id都可以解析,您也不能SomeObject就像id一样{。}}。

这实际上比最初看起来更有用。它将允许沿着已知的树分支引用对象,而无需返回并仔细地接口属性或别名,以便公开分支结构以进行查找。这也是为id: root使用有意义且唯一的标识符的一个很好的理由,而不是使用[{"Consecutive":11,"Code":"E5ZQHZ","Cvv":"GNH","IdCoupon":77236},{"Consecutive":12,"Code":"WM96FY","Cvv":"NGE","IdCoupon":77237}] 作为每个qml文件的根对象。