2017-02-15 17 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++擁有)' –