支持從實例到組件的隱式轉換。
所以這樣的:
Loader {
sourceComponent: Item {
id: toLoad
}
}
簡單說就是這個隱含的版本:
Loader {
sourceComponent: Component {
Item {
id: toLoad
}
}
}
當您綁定到一個屬性,該值由「父」對象收集,但它是沒有爲它服務。該項目是不是一個實例,而是一個屬性,屬性不父:
property Item name: Item {
Component.onCompleted: console.log(name.parent) \\ null
}
當實際組件實例化這種改變,並且它是非常父它需要的地方是:
Row {
Loader {
sourceComponent: MouseArea {
id: toLoad
width: 200
height: 200
onClicked: {
console.log(parent) \\ QQuickLoader(0x2128768)
console.log(toLoad.parent) \\ QQuickLoader(0x2128768)
}
}
}
Loader {
sourceComponent: myComp
}
}
Component {
id: myComp
MouseArea {
width: 200
height: 200
onClicked: console.log(parent) // QQuickLoader(0x2128768)
}
}
Component.onCompleted: console.log(toLoad.parent) // ReferenceError: toLoad is not defined
從該代碼可以看出,您甚至無法從組件外部訪問組件中的ID。所以我不知道你在哪裏得到這個空父對象,在外面沒有這樣的ID,而在內部對象將被實例化,它肯定會有父對象。
另外請注意,Component
也是一種特殊情況,因爲它甚至不暴露父母,即使你確實有父母。
應該注意和區分,Qt Quick中有父母和視覺父母。它們通常因物體而異。 – Orient
*「支持從實例到組件的隱式轉換。」*沒有實例。對於'Component'類型的每個屬性,它都會將代碼解析到一個組件中。如果它會隱式地將實例轉換爲一個組件,可以這樣寫:'sourceComponent:Qt.createComponent(「SomeQML.qml」)。createObject(...)'這將失敗,並且「*無法將QQuickItem分配給QQmlComponent *」。 *「只是這個隱含的版本:」*是正確的。 – derM
*「還要注意,組件也是一種特殊情況,因爲它甚至不會暴露父對象,即使它確實有它。」* =>與「QtObject」類似,組件沒有可視父對象。 'Component {parent:...}'將會失敗。它可能在Qt父項意義上有父項,但沒有可視父項,這些都是QML中的所有項。非視覺父母從不暴露。 – derM