如何从C++代码中创建从QQuickItem派生的我自己的对象的实例的正确方法是什么?
目前,我正在使用以下代码片段创建新对象:
//setup default values
MyType* quickItem = new MyType;
quickItem->setParent(parent);
quickItem->setParentItem(qobject_cast<QQuickItem*>(parent));
QQmlEngine::setObjectOwnership(quickItem, QQmlEngine::JavaScriptOwnership);它工作得很好,但是由于没有设置isComponentComplete标志,所以void componentComplete()不会被执行。
在对象创建后手动调用componentComplete()方法安全吗?
或者有没有能够创建C++对象并执行正确初始化的QmlFactory?
发布于 2016-01-12 03:44:29
我猜问题在于,在创建对象时,对应该发生的事情有一个错误的预期。
正如您从documentation中看到的,QQuickItem::componentComplete覆盖了QQmlParserStatus::componentComplete,这是一个纯虚拟成员方法。
如果你看一下QQmlParserStatus::componentComplete的documentation,它会指出:
在导致此实例化的根组件完成构造后调用的
。..。
从您的示例中,在我看来,没有导致实例化的根对象,因为您显式地分配了它。
正因为如此,没有理由应该调用该方法,而您正在确认这一点,因此一切都按预期工作。
这是你所期待的吗?也许不是,所以这可能是错误所在。
编辑
你还问了:
在对象创建后手动调用componentComplete()方法安全吗?
嗯,我会按照我在评论中发布的链接中的建议导出类型,然后我会从QML环境中实例化对象,因为这似乎是正确的方法,也是预期的方法。
https://stackoverflow.com/questions/34727502
复制相似问题