如何从C++;? < >从C++代码中创建如何从 qQuijys中创建自己的对象的正确方法是什么?< /P>

如何从C++;? < >从C++代码中创建如何从 qQuijys中创建自己的对象的正确方法是什么?< /P>,c++,qt5,qtquick2,C++,Qt5,Qtquick2,目前,我正在使用以下代码段创建新对象: //setup default values MyType* quickItem = new MyType; quickItem->setParent(parent); quickItem->setParentItem(qobject_cast<QQuickItem*>(parent)); QQmlEngine::setObjectOwnership(quickItem, QQmlEngine::JavaScriptOwnershi

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

//setup default values
MyType* quickItem = new MyType;
quickItem->setParent(parent);
quickItem->setParentItem(qobject_cast<QQuickItem*>(parent));
QQmlEngine::setObjectOwnership(quickItem, QQmlEngine::JavaScriptOwnership);
//设置默认值
MyType*quickItem=新的MyType;
quickItem->setParent(父项);
quickItem->setParentItem(qobject_cast(父项));
QQmlEngine::setObjectOwnership(quickItem,QQmlEngine::JavaScriptOwnership);
它工作得很好,但执行的
void componentComplete()
与未设置
isComponentComplete
标志的执行方式不同

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


< >或者有任何<代码> QmlFactory <代码>,它能够创建C++对象并执行正确的初始化?

< p>我猜问题在于,当创建对象时应该有错误的预期。

从中可以看到,
QQuickItem::componentComplete
覆盖了
qqqmlparserstatus::componentComplete
,这是一个纯虚拟成员方法

如果查看
QQmlParserStatus::componentComplete
,它指出:

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

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

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

编辑

你还问:

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


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

可能会有帮助吗?实际上,它是一个
QObject
,所以…感谢您的链接。我想我读了Qml/Qt文档中的每一页大约一百次,但不幸的是,我没有发现任何关于这个主题的内容。没有提及(提供的链接与任何其他QML文档一样)如何直接从C++中创建纯QQuestItand,调用CULTFECTORE()事件。好,得到它,让我添加一个答案。不幸的是,这个解决方案是不可能的。我需要在创建/初始化过程中从另一个C++ QQuiQuy组件创建C++ QQuiQuest组件。唯一的解决办法是用QML组件封装QQuijType,而不是从C++中创建它,但是这对我来说似乎是多余的。这是有道理的,我不知道哪个是真正的问题,所以我只能尽我所能给出答案和建议。不管怎样,现在清楚为什么不调用该方法了吗?有时文档很难阅读,因为它被分散在几页上。是的,现在不调用方法的原因已经很清楚了。我仍然想知道的是,QQuickItem类是否应该按照我描述的方式创建,或者是否有其他推荐的方法。