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

时间:2016-01-11 17:24:53

标签: c++ qt5 qtquick2

如何从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 ++对象并执行正确的初始化吗?

1 个答案:

答案 0 :(得分:0)

我猜问题是对创建该对象时应该发生的事情存在错误的期望。

documentationQQuickItem::componentComplete覆盖QQmlParserStatus::componentComplete可以看出,这是一种纯虚拟成员方法。

如果您查看QQmlParserStatus::componentComplete的{​​{3}},则会说明:

  

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

从您的示例中,在我看来,没有根对象导致实例化,因为您明确地分配它。
因此,没有理由应该调用该方法并确认这一点,所以一切都按预期工作。

那是你所期待的吗?也许不,所以这可能是错误。

修改

你也问过:

  

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

好吧,我按照我在评论中发布的链接中的建议导出类型,然后我将实例化QML环境中的对象,因为它似乎是正确的方法以及预期的方法。