如果 Loader 的 sourceComponent Item 引用了它的父项,并且我设置了 "loader.active = false",我会得到一个错误
If Loader's sourceComponent Item references its parent, and I set "loader.active = false", I get an error
我的代码:
import QtQuick 2.6
import QtQuick.Window 2.2
Window {
visible: true
width: 640
height: 480
Item {
id: loaderParent
Loader {
id: loader
active: true
sourceComponent: Item {
parent: loaderParent
x: parent.x
}
}
}
Item {
focus: true
Keys.onPressed: {
loader.active = false;
}
}
}
当我按任意键时,出现此错误:
qrc:/main.qml:16: TypeError: Cannot read property of null
以为我怀疑这个错误是无害的,我想要一个解释或任何关于 fix/workaround 的想法?
已举报here。
我找到了解决方法:不获取 parent.x
,而是获取 loaderParent.x
。还是想知道为什么会出现这个问题。
Loader
似乎在销毁时将项目父级设置为 null。 QML 对象不会立即删除,而是使用 deleteLater()
使对象在另一个事件循环周期中保持活动状态。
这会导致重新计算绑定表达式,这不再可能,因为父级现在为空。我遇到过更严重的这种行为 described here。
避免它的一个简单方法是不使用您已经找到的父 属性,或者使用更复杂的绑定表达式,例如 x: loader.active ? parent.x : someFailsafeValue
.
通过使用 onParentChanged: console.log(parent)
您可以验证当加载程序停用时父级确实更改为 null。
我的代码:
import QtQuick 2.6
import QtQuick.Window 2.2
Window {
visible: true
width: 640
height: 480
Item {
id: loaderParent
Loader {
id: loader
active: true
sourceComponent: Item {
parent: loaderParent
x: parent.x
}
}
}
Item {
focus: true
Keys.onPressed: {
loader.active = false;
}
}
}
当我按任意键时,出现此错误:
qrc:/main.qml:16: TypeError: Cannot read property of null
以为我怀疑这个错误是无害的,我想要一个解释或任何关于 fix/workaround 的想法?
已举报here。
我找到了解决方法:不获取 parent.x
,而是获取 loaderParent.x
。还是想知道为什么会出现这个问题。
Loader
似乎在销毁时将项目父级设置为 null。 QML 对象不会立即删除,而是使用 deleteLater()
使对象在另一个事件循环周期中保持活动状态。
这会导致重新计算绑定表达式,这不再可能,因为父级现在为空。我遇到过更严重的这种行为 described here。
避免它的一个简单方法是不使用您已经找到的父 属性,或者使用更复杂的绑定表达式,例如 x: loader.active ? parent.x : someFailsafeValue
.
通过使用 onParentChanged: console.log(parent)
您可以验证当加载程序停用时父级确实更改为 null。