如何从 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++对象并执行正确的初始化?
最佳答案
我想问题在于当您创建该对象时,对应该发生的事情有错误的期望。
从documentation可以看出, QQuickItem::componentComplete
重写了QQmlParserStatus::componentComplete
,即纯虚成员方法。
如果您查看 documentation QQmlParserStatus::componentComplete
,它指出:
Invoked after the root component that caused this instantiation has completed construction. [...]
从您的示例来看,在我看来,没有导致该实例化的根对象,因为您正在显式分配它。
因此,没有理由调用该方法并且您确认了这一点,所以一切都按预期工作。
这就是您所期待的吗?也许不是,所以这可能是错误。
编辑
您还问过:
Is it safe to call componentComplete() method manually after object creation?
好吧,我将按照我在评论中发布的链接中的建议导出类型,然后从 QML 环境中实例化对象,因为这似乎是正确的方法,也是预期的方法。
关于c++ - 如何从 C++ 正确实例化 QQuickItem 派生对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34727502/