2017-02-15 81 views
1

今天我在我们的程序中遇到了一个奇怪的错误。 QObject继承的类的对象被类型为QEvent::DefferedDelete的事件删除,但没有人可以发送它。QObject在被放入QML变量后被破坏

它被传递到QML为的QVariant:

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

如果没有QML线一切运作良好 - 没有产生删除事件。

回答

1

我发现如果在将它传入QML之前将其设置为QObject的父级,那么它不会被删除。所以,我已经得出结论,将未经过身份验证的QObject传递到QML作用域中会使该作用域成为QObject的父项,并在作用域结束后调用它的析构函数。

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

+0

您是对的,请点击此处:http://doc.qt.io/qt-5/qtqml-cppintegration-data.html#data-ownership。 “此外,QML引擎尊重Qt C++对象的正常QObject父所有权语义,并且永远不会删除具有父级的QObject实例。”而且,如果您不在QObject上明确设置cpp所有权,QML将默认声明所有权。 – Blabdouze

+0

你可以通过一个父类来保持C++所有权(实际上父类是拥有者),或者使用'QQmlEngine :: setObjectOwnersship(object,QQmlEngine :: CppOwnership)告诉QML引擎你期望该对象被C++拥有)' –