[Development] QQmlEngine and ObjectOwnership

Massimo Callegari massimocallegari at yahoo.it
Tue Apr 28 12:08:43 CEST 2015


Hi everyone,

I want to share my experience with the garbage collection of registered classes through qmlRegisterType.

I got crazy to understand why my application was randomly crashing and I hope this will help others in the future.

Basically if you want to expose a C++ class in the QML world, you do something like:

qmlRegisterType<MyClass>("com.myapp.classes", 1, 0, "MyClass");

Then you can use the class methods exposed with Q_PROPERTY in QML like this: MyClass.myProperty

The thing is that when dealing with class pointers, the QML engine performs garbage collection of the exposed classes when it no longer needs them.

If your classes are created in C++ (new MyClass()) at some point in the C++ code, you will find that the class has been destroyed by QML !! This causes a bunch of segFaults like there is no tomorrow.

So, after getting crazy to discover this, I discovered also that there is a method of QQmlEngine to
assign the ownership of a class:

QQmlEngine::setObjectOwnership(myNewClass, QQmlEngine::CppOwnership);


After adding this simple line after a "myNewClass = new MyClass()", everything started to working properly.

Note that in my application, classes created in C++ exist as long as the application lives.
Now, I found pretty counter-intuitive that a class created in C++ is actually owned by QML (
QQmlEngine::JavaScriptOwnership)


I believe the default ownership should be CppOwnership if the class is created in C++ and then, in case, the developer can do the other way around, letting QML to handle the destruction of QObjects.

Cheers,

Massimo



More information about the Development mailing list