[Development] QQmlEngine and ObjectOwnership
Massimo Callegari
massimocallegari at yahoo.it
Tue Apr 28 12:30:12 CEST 2015
Hello Gianluca,
interesting point indeed.
However double constructors seems like a workaround to me for the chicken and the egg problem :)
Then, obviously, if it works it works. No question about that ! :)
Massimo
----- Messaggio originale -----
Da: Gianluca <gmaxera at gmail.com>
A: Massimo Callegari <massimocallegari at yahoo.it>
Cc: "development at qt-project.org" <development at qt-project.org>
Inviato: Martedì 28 Aprile 2015 12:21
Oggetto: Re: [Development] QQmlEngine and ObjectOwnership
Hello Massimo,
I got crazy last year for the same reason … and one developer drive me in the right direction and solved the problem in a slightly different way of you.
In my code, sometimes the object is created from QML side … and sometimes is created from C++. In these situations, the ideal behavior should be (of course for me), that object created in C++ are not owned by QML … but as you find, the situation is not like that.
So, another strangeness of the owernship by QML … is that depends on the parent of the object created :-S
I discovered that if the parent is a QObject created by me outside QML (so, in C++ code) the QML doesn’t take ownership.
So, that’s my weird solution: two constructor
1) one set as parent a singleton object created from C++ code, and I use it when I need to create the code from C++ and pass the object to QML
2) another that doesn’t set the parent, and I use it from QML and in this way, then the QML destroy it whenever it wants and it’s ok because this object never pass to C++.
Ciao,
Gianluca.
Il giorno 28/apr/2015, alle ore 12:08, Massimo Callegari <massimocallegari at yahoo.it> ha scritto:
> 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
> _______________________________________________
> Development mailing list
> Development at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/development
More information about the Development
mailing list