如何访问绑定到QML中属性的组件

如何访问绑定到QML中属性的组件,qml,Qml,有几次我想访问绑定到另一个属性的组件的属性。我花了好几天的时间试图找出如何做到这一点,但都失败了。下面是我正在尝试做的一个简单的例子 TabView { Component.onCompleted: console.log(style.frameOverlap) // OR tvStyle.frameOverlap style: TabViewStyle { id: tvStyle frameOverlap: 5 } } 这种方法根本不管用。我完全搞不懂如何静

有几次我想访问绑定到另一个属性的组件的属性。我花了好几天的时间试图找出如何做到这一点,但都失败了。下面是我正在尝试做的一个简单的例子

TabView {
  Component.onCompleted: console.log(style.frameOverlap)
  // OR tvStyle.frameOverlap

  style: TabViewStyle {
    id: tvStyle
    frameOverlap: 5
  }
}
这种方法根本不管用。我完全搞不懂如何静态或作为实例访问这些成员。有人能给我解释一下这样的事情是否可行吗


谢谢。

简短的回答是你需要写:

Component.onCompleted: console.log(__styleItem.frameOverlap)
较长的答案是“style”属性是一个组件。组件可以记住一个声明树,并可以根据需要创建对象。但是,它不会公开记住的声明,因此当您尝试访问
frameOverlap
属性时,它不在那里

理论上,您可以调用
style.createObject
来创建一个对象,并检查其属性,但这将创建另一个不必要的实例,因此您可以查看TabView.qml,注意它创建了一个已经使用Loader的实例,并将其存储在名为
\uStyleItem
的属性中,然后使用我上面给出的代码


当然,访问内部属性不是一个特别好的主意,但在实践中可能还可以。理想情况下,应该能够实例化TabViewStyle,并将实例绑定到
style
属性,让TabView确定它是组件还是对象,但我不确定这是否可能。

一旦你有权访问它,你想做什么?嗯,通常只是读取其中一个属性来调整另一个视觉元素的大小。例如,今天我尝试获取选项卡按钮的高度,TabViewStyle.tab.height。是否提供完整的
TabViewStyle
?例如,您是否分配了所有希望访问的属性?如果是这样,您可以在“外部”范围中定义属性,如
frameOverlap
,并让您的样式引用它们。这应该注意,它是一个“私有”的内部属性,可以随任何版本而更改(尽管我认为不太可能)。没错,我已经扩展了答案。