QML:无法读取未定义的 属性 'xxx'
QML: Cannot read property 'xxx' of undefined
ApplicationWindow {
id: root
property string rootName: "--rootName"
visible: true
width: 800
height: 400
title: qsTr("WatchFace Maker")
WatchLcd{
property string watchLcdInApp: "watchLcdInApp"
id: watchLcd
}
TextAdder{
id: textAdder
Component.onCompleted: {
console.log("APP: ", root.watchLcd.watchLcdInApp)//#Error!!! remove root, it works.
}
}
}
我想知道:
为什么我在上面的注释行中添加 root id 时不起作用?
如果子组件是从 XXX.qml 文件创建的,子组件如何访问兄弟组件的 属性?
id
属性是属性的"special kind",只在"code time"解析,运行时无法解析。
root.watchLcd
将不起作用,因为 watchLcd
是一个 id
,因此无法用 root.watchLcd
解析
id
在逻辑上也只在那个特定的源中工作,你只需要那个特定的 id
而不管对象树的结构,你不需要它的父 id
如 root.watchLcd
如果你想从另一个文件访问一个特定的对象,自然地,这不能通过它的 id
发生。您可以使用 属性 或函数:
//SomeItem.qml
Item {
property alias text : obj.text
Item {
id: obj
property string text
}
property Item object : obj
function getObj() { return obj }
}
/main.qml
Window {
visible: true
SomeItem {
id: item
text: "someText"
}
SomeItem {
Component.onCompleted: {
//console.log(item.obj.text) // TypeError: Cannot read property 'text' of undefined
console.log(item.object.text) // someText
console.log(item.getObj().text) // someText
}
}
}
此外,请注意 property alias
的工作原理 - 它在许多情况下可能很有用,如果您需要访问的只是一个嵌套对象的 属性,您可以使用别名公开它而无需访问到外部对象。
ApplicationWindow {
id: root
property string rootName: "--rootName"
visible: true
width: 800
height: 400
title: qsTr("WatchFace Maker")
WatchLcd{
property string watchLcdInApp: "watchLcdInApp"
id: watchLcd
}
TextAdder{
id: textAdder
Component.onCompleted: {
console.log("APP: ", root.watchLcd.watchLcdInApp)//#Error!!! remove root, it works.
}
}
}
我想知道:
为什么我在上面的注释行中添加 root id 时不起作用?
如果子组件是从 XXX.qml 文件创建的,子组件如何访问兄弟组件的 属性?
id
属性是属性的"special kind",只在"code time"解析,运行时无法解析。
root.watchLcd
将不起作用,因为 watchLcd
是一个 id
,因此无法用 root.watchLcd
id
在逻辑上也只在那个特定的源中工作,你只需要那个特定的 id
而不管对象树的结构,你不需要它的父 id
如 root.watchLcd
如果你想从另一个文件访问一个特定的对象,自然地,这不能通过它的 id
发生。您可以使用 属性 或函数:
//SomeItem.qml
Item {
property alias text : obj.text
Item {
id: obj
property string text
}
property Item object : obj
function getObj() { return obj }
}
/main.qml
Window {
visible: true
SomeItem {
id: item
text: "someText"
}
SomeItem {
Component.onCompleted: {
//console.log(item.obj.text) // TypeError: Cannot read property 'text' of undefined
console.log(item.object.text) // someText
console.log(item.getObj().text) // someText
}
}
}
此外,请注意 property alias
的工作原理 - 它在许多情况下可能很有用,如果您需要访问的只是一个嵌套对象的 属性,您可以使用别名公开它而无需访问到外部对象。