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

标签 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++对象并执行正确的初始化?

最佳答案

我想问题在于当您创建该对象时,对应该发生的事情有错误的期望。

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/

相关文章:

c++ - 常量字符串与#define

c++ - Qt 小部件 4.7 与 5.1

c++ - Qt- 移动 QGraphicsItem 会导致伪影。留下痕迹

qml - 手动更新/重新绘制项目

QtQuick2拖动无框窗口

c++ - C++ 中的宽字符串 SQLite 查询

c++ - 从不同的 C++ 类访问 Mysql * 连接变量

c++ - 二维 map 查看器未处理的异常

qt - 如何在 QLineEdit 中设置插入符号闪烁光标的颜色

qt - 选项卡未激活时未定义的元素