访问父项的属性不起作用(QML)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了访问父项的属性不起作用(QML)相关的知识,希望对你有一定的参考价值。
我有一个EntityBase
(Player
),其中包含Item
,其中包含动态加载项目的Loader
(Modules
)。
现在我需要访问Player
中Modules
的属性。
印刷(console.debug
)Module
的parent.parent.parent
输出
Player_QMLTYPE_127(0x2ac147f0)
所以我认为我可以通过编写Player
来访问parent.parent.parent.myProperty
的属性,但我的属性或子元素都不会显示在自动完成列表中。
有什么我想念的吗?或者这根本不可能?
我想在这种情况下最好的方法是使用signal
s和Connection
s从组件内部向最外面的项目进行通信,如here所述。
它遵循从文档中复制的示例(其中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或其父Item中定义的任何函数。
如果我正确地理解了这个问题,那就类似于你实际上要做的事情,但我发现它限制了项目的可重用性,因为它对周围环境做出了假设,而我通常不喜欢它(当然,这是我的设计理念,它并不是假装最好的设计。
另请注意,Loader
的父属性指向其可视父级,可能与您期望的不同。那是因为它实际上是一个Item
并且它继承了它的父属性。
有关详细信息,请参阅here。
相反,要在加载的项目上创建属性,而不是通过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将自己设置为正在加载的组件的上下文对象)。
关于组件的范围,从here您可以发现:
组件范围是组件中对象ID与组件根对象属性的并集。
以上是关于访问父项的属性不起作用(QML)的主要内容,如果未能解决你的问题,请参考以下文章