从 C++ 设置创建的 qml 对象的父级不起作用

Posted

技术标签:

【中文标题】从 C++ 设置创建的 qml 对象的父级不起作用【英文标题】:Setting parent of a created qml object from C++ is not working 【发布时间】:2015-07-14 11:41:00 【问题描述】:

我有一个创建 QML 对象的 C++ 类,它需要五个参数:

//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_;

我在QML中使用如下:

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

       
    

在 C++ 上下文中,我可以正确打印我设置的属性的值,以及 parent of the created object. However, when I print them from QML, theparenthas anulland the properties areundefined`。

我从 C++ 和 QML 打印了创建的对象的地址,我得到了相同的地址。我不明白是什么导致了这种行为。

感谢您的帮助。

【问题讨论】:

我在 Windows 上使用 Qt 5.5.0 【参考方案1】:

我通过在 C++ 代码中添加以下代码行解决了这个问题:

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

【讨论】:

以上是关于从 C++ 设置创建的 qml 对象的父级不起作用的主要内容,如果未能解决你的问题,请参考以下文章

引导折叠数据父级不起作用

AngularJS 1.5- ui-router:在状态内调用组件,父级不起作用

C++ 虚拟方法:我必须在父类中为子级和父级不共享的每个方法创建一个虚拟方法吗?

约束布局与嵌套滚动视图中的父级不匹配

Android子视图高度与ListView项目中的父级不匹配

ListView布局高度与Fragment中的RecyclerView内的父级不匹配