【问题标题】:QObject gets destroyed after being put into QML variableQObject 在放入 QML 变量后被销毁
【发布时间】:2017-02-15 15:56:05
【问题描述】:

今天我在我们的程序中遇到了奇怪的错误。从QObject 继承的类的对象被QEvent::DefferedDelete 类型的事件删除,而没有人可以发送它。

它作为 QVariant 传递到 QML:

// cpp: 
        Q_INVOKABLE QVariant currentDevice_v() const {
            return QVariant::fromValue(_current);
        }
// qml: 
       Component.onCompleted: {
            curDevice = devicesModel.currentDevice_v()
            #...
       }

如果没有 qml 行,一切都运行良好 - 不会产生删除事件。

【问题讨论】:

    标签: qt qml qtquick2


    【解决方案1】:

    我发现如果我在将 QObject 传递到 QML 之前设置它的父级,那么它不会被删除。因此,我得出的结论是,将无父 QObject 传递到 QML 范围会使该范围成为 QObject 的父级,并在范围结束后调用其析构函数。

    分享这个,因为我在任何地方都没有找到答案。但是在写这篇文章时,我发现了类似的未解决问题:Qt5.6 QML, why are dynamic models destroyed after garbage collection?

    【讨论】:

    • 你是对的,请看这里:doc.qt.io/qt-5/qtqml-cppintegration-data.html#data-ownership。 “此外,QML 引擎尊重 Qt C++ 对象的正常 QObject 父所有权语义,并且永远不会删除具有父级的 QObject 实例。”此外,如果您没有在 QObject 上显式设置 cpp 所有权,QML 将默认声明所有权。
    • 您可以传递一个父对象以保持 C++ 所有权(实际上父对象就是所有者),或者告诉 QML 引擎您希望该对象归 C++ 所有,使用 QQmlEngine::setObjectOwnersship(object, QQmlEngine::CppOwnership)跨度>
    猜你喜欢
    • 2012-01-30
    • 2016-09-21
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2011-06-25
    • 2021-03-06
    相关资源
    最近更新 更多