0

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.

BaCaRoZzo
  • 7,502
  • 6
  • 51
  • 82
Mido
  • 1,092
  • 1
  • 9
  • 14

1 Answers1

1

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

mainObject_->setParentItem(qobject_cast<QQuickItem*>(parent));   
Mido
  • 1,092
  • 1
  • 9
  • 14