如何调试错误“无法读取 null 的属性”

ymo*_*eau 5 qt qml

在一个大型 QML 项目中,有时我会收到以下错误:

MyItem.qml:8: TypeError: 无法读取 null 的属性

当我查看相关行时,它总是在一个子项中,具有一个属性绑定到一个父属性,如

Item
{
    id: myItem

    ASubItem
    {
         id: subItem
         width: parent.width
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,父项似乎变为空,并且内部项在此之后尝试更新其属性。

我们有时会从 C++ 中删除项目,因为我们想创建新项目,这似乎是错误消息的原因。我们还从 C++ 创建了一些项目(使用QQmlComponent)并将父项和父项设置为QQuickItem包含这些项目的 ,但似乎我在其他项目上也遇到了这个错误。

但我不明白为什么内部项目会在父项为空时尝试更新自己,不应该同时删除它吗?
有什么方法可以调试它以查看父项何时被删除以及其子项何时尝试更新?

sad*_*deq 1

一个对我有用的解决方法,但是我的情况有点不同,因为我是从 Javascript 而不是 C++ 动态创建对象,但我相信你可以弄清楚如何从 C++ 中做到这一点。

我将 QGuiApplication 实例传递给根 QML Context

    engine.rootContext()->setContextProperty("KApp",&app);
Run Code Online (Sandbox Code Playgroud)

然后建立了这个连接

    Connections{ 
    target: KApp;
    onAboutToQuit:{
        dynamicallyCreatedObject.destroy();
    }
}
Run Code Online (Sandbox Code Playgroud)

所以重点是,当aboutToQuit()信号发出时,你必须销毁动态创建的 QML 对象