如果Loader的sourceComponent Item引用其父项,并且我设置了" loader.active = false",则会出现错误

时间:2017-07-07 17:57:52

标签: qt qml runtime-error qtquick2

我的代码:

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:无法读取null

的属性

我以为我怀疑这个错误是无害的,我想解释或修改/解决方法的任何想法?

报告here

2 个答案:

答案 0 :(得分:0)

我找到了一种解决方法:取代parent.x,而不是抓取loaderParent.x。仍然想知道问题发生的原因。

答案 1 :(得分:0)

Loader似乎在销毁时将项目父级设置为null。 QML对象不会立即删除,而是使用deleteLater()使对象保持活动状态以进行另一个事件循环。

这导致重新评估绑定表达式,由于父级现在为null,因此不再可能。我遇到过这种行为described here的更严重的遭遇。

避免它的一种简单方法是不使用您已找到的父属性,或使用更复杂的绑定表达式,例如x: loader.active ? parent.x : someFailsafeValue

通过使用onParentChanged: console.log(parent),您可以验证在取消激活加载器时父级确实更改为null。