繁体   English   中英

如何从C ++正确实例化QQuickItem派生的对象?

[英]How to correctly instantiate QQuickItem-derived object from C++?

如何创建从C ++代码从QQuickItem派生的我自己的对象的实例的正确方法是什么?

目前,我正在使用以下代码段创建新对象:

//setup default values
MyType* quickItem = new MyType;
quickItem->setParent(parent);
quickItem->setParentItem(qobject_cast<QQuickItem*>(parent));
QQmlEngine::setObjectOwnership(quickItem, QQmlEngine::JavaScriptOwnership);

它的工作效果很好,但未执行void componentComplete()方式与未设置isComponentComplete标志的方式相同。

创建对象后手动调用componentComplete()方法是否安全?

还是有任何QmlFactory能够创建C ++对象并执行正确的初始化?

我想问题是创建该对象时会发生错误的期望。

文档中可以看到, QQuickItem::componentComplete覆盖了QQmlParserStatus::componentComplete ,这是一个纯虚拟成员方法。

如果查看QQmlParserStatus::componentComplete文档 ,则会指出:

在导致该实例化的根组件完成构造之后调用。 [...]

从您的示例中,在我看来,没有根对象导致该实例化,因为您正在显式分配它。
因此,没有理由应调用该方法,而您正在确认这一点,因此一切工作均按预期进行。

那是您所期望的吗? 也许不行,所以这可能是错误。

编辑

您还问:

创建对象后手动调用componentComplete()方法是否安全?

好吧,我将按照注释中发布的链接中的建议导出类型,然后从QML环境中实例化对象,因为这似乎是正确的方法,也是预期的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM