如何从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 ++对象并执行正确的初始化吗?
答案 0 :(得分:0)
我猜问题是对创建该对象时应该发生的事情存在错误的期望。
从documentation,QQuickItem::componentComplete
覆盖QQmlParserStatus::componentComplete
可以看出,这是一种纯虚拟成员方法。
如果您查看QQmlParserStatus::componentComplete
的{{3}},则会说明:
在导致此实例化的根组件完成构建后调用。 [...]
从您的示例中,在我看来,没有根对象导致实例化,因为您明确地分配它。
因此,没有理由应该调用该方法并确认这一点,所以一切都按预期工作。
那是你所期待的吗?也许不,所以这可能是错误。
修改强>
你也问过:
在创建对象后手动调用componentComplete()方法是否安全?
好吧,我按照我在评论中发布的链接中的建议导出类型,然后我将实例化QML环境中的对象,因为它似乎是正确的方法以及预期的方法。