我有一个包含Item
的EntityBase
(Player
),其中包含动态加载项(Modules
)的Loader
。
现在我需要访问Modules
中Player
的属性。
打印(console.debug
)Module
的parent.parent.parent
输出
播放器_QMLTYPE_127(0x2ac147f0)
所以我想我可以通过编写parent.parent.parent.myProperty
来访问Player
的属性,但我的属性或子元素都没有显示在自动完成列表中。
我有什么东西不见了吗?或者这根本不可能?
我想在这种情况下,最好的方法是使用signal
s和Connection
s从组件内部向最外面的项目进行通信,如下所述。
它遵循从文档中复制的一个示例(其中MyItem.qml
是您正在动态加载的项目):
import QtQuick 2.0
Item {
width: 100
height: 100
Loader {
id: myLoader
source: "MyItem.qml"
}
Connections {
target: myLoader.item
onMessage: console.log(msg)
}
}
无论如何,文件还确认:
或者,由于MyItem.qml是在Loader的范围内加载的,因此它也可以直接调用Loader或其父项中定义的任何函数。
如果我正确理解了这个问题,这与你实际想做的类似,但我发现它限制了项目的可重用性,因为它对周围环境进行了假设,我通常不喜欢它(当然,这是我的设计理念,它不会假装是最好的)。
还要注意的是,Loader
的parent属性指向其视觉父级,这可能与您预期的有所不同。这是因为它实际上是一个Item
,并且继承了其父属性。
请参阅此处了解更多详细信息。
相反,要在创建后设置加载项的属性,而不是让它通过parent.parent...
链来访问它们,您可以将这些属性放在Loader
对象上,并按如下方式轻松访问它们(这是从文档中获得的另一个示例):
Item {
width: 400
height: 400
Component {
id: myComponent
Text { text: modelIndex }
}
ListView {
anchors.fill: parent
model: 5
delegate: Component {
Loader {
property int modelIndex: index
sourceComponent: myComponent
}
}
}
}
事实上,正如文档中所述,您可以:
[…]显式地将所需信息设置为Loader的属性(这是因为Loader将自己设置为正在加载的组件的上下文对象)。
关于组件的范围,从这里你可以发现:
组件作用域是组件内对象ID和组件根对象属性的并集。