Search code examples
c++qtqmlqtquick2qt5.5

Setting parent of a created qml object from C++ is not working


I have a C++ class that creates a QML object, it takes five parameters:

//prototype 
// Q_INVOKABLE QQuickItem *createQmlObject(QObject *parent, QString path, QString id="", int x=0, int y=0);

QQuickItem * QmlItemCreator::createQmlObject(QObject* parent,QString path,QString id,int x,int y)
{
    QQmlEngine engine;
    QQmlComponent component(&engine, QUrl::fromLocalFile(path));
    QQuickItem * mainObject_;
    if(component.isError())
    {
        qWarning() << "QmlItemCreator::createQmlObject The QMLComponent for "
                   << path << " has errors: " << component.errorString();
    }
    else if (component.isReady())
    {
        mainObject_ = qobject_cast<QQuickItem*>(component.create());
        QQmlEngine::setObjectOwnership(mainObject_, QQmlEngine::JavaScriptOwnership);
        mainObject_->setProperty("id",id);
        mainObject_->setProperty("x",x);
        mainObject_->setProperty("y",y);
        mainObject_->setParent(parent);

       // qDebug()<<mainObject_<<"  "<<mainObject_->parent()<<"  "<<mainObject_->property("x");
    }
    else
    {
        componentComplete();
    }

    return mainObject_;
}

I use it in QML as follows:

 Item{
    id: idRoot
        Component.onCompleted:
       {
            var obj = qmlCreator.createQmlObject(idRoot,"path/test.qml")
           console.log(obj.parent)// print null !! 

       }
    }

While in C++ context, I can correctly print the value of the properties I set, as well as the parent of the created object. However, when I print them from QML, theparenthas anulland the properties areundefined`.

I printed the adress of the created object from C++ and from QML and I've got the same address. I don't understand what's causing this behaviour.

Thanks for your help.


Solution

  • I've solved the issue by adding the following line of code to the C++ code:

    mainObject_->setParentItem(qobject_cast<QQuickItem*>(parent));