2017-02-15 3 views
1

eingefügt wurde Heute habe ich merkwürdigen Programmfehler in unserem Programm gegenübergestellt. Das Objekt einer Klasse, die von QObject geerbt wurde, wurde von Ereignis mit Typ QEvent::DefferedDelete gelöscht, während niemand es möglicherweise senden konnte.QObject wird zerstört, nachdem es in die QML-Variable

Es wurde in QML als QVariant geben:

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

Ohne diese alles qml Linie funktionierte gut - nichts produziert Ereignis löschen.

Antwort

1

Was ich herausgefunden habe, dass, wenn ich das übergeordnete Element dieses QObject setze, bevor ich es in QML übergebe, dann wird es nicht gelöscht. Also, ich bin zu dem Schluss gekommen, dass das Übergeben von nichtparentierten QObject in den QML-Bereich diesen Bereich zu einem Elternteil von QObject macht und seinen Destruktor nach dem Ende des Bereichs aufruft.

Teilen Sie dies aus, da ich nirgends eine Antwort gefunden habe. Aber während des Schreibens dieses Beitrags habe ich ähnliche unbeantwortete Frage gefunden: Qt5.6 QML, why are dynamic models destroyed after garbage collection?

+0

Sie haben Recht, überprüfen Sie hier: http://doc.qt.io/qt-5/qtqml-cppintegration-data.html#data-ownership. "Darüber hinaus respektiert die QML-Engine die normale QObject-Parent-Ownership-Semantik von Qt C++ - Objekten und löscht niemals eine QObject-Instanz, die ein Elternobjekt besitzt." Und wenn Sie cpp nicht explizit für ein QObject festlegen, wird QML standardmäßig die Eigentümerschaft beanspruchen. – Blabdouze

+0

Sie können entweder ein übergeordnetes Element übergeben, um das C++ - Eigentum beizubehalten (das übergeordnete Objekt ist dann das Eignerobjekt), oder dem QML-Modul mitteilen, dass das Objekt C++ gehören soll. Verwenden Sie dazu 'QQmlEngine :: setObjectOwnership (object, QQmlEngine :: CppOwnership) ' –

Verwandte Themen