在Qt3D中添加和删除实体时崩溃

时间:2017-03-07 14:49:01

标签: qt qt3d

我有应该在运行时创建和删除的实体。实体只有材质和网格组件。材质是QDiffuseMapMaterial和QTextureImage。

当实体开始在场景中添加和删除时,有时应用程序会因此断言而崩溃:

  

qt_assert:ASSERT:" img!= nullptr"在文件中   ../../include/Qt3DRender/5.8.0/Qt3DRender/private/../../../../../src/render/texture/apitexturemanager_p.h,   第286行

但不幸的是我无法弄清楚它为什么会发生。我正在以这种方式添加实体:

addRow

就像这样删除:

QEntity * visibleObject = new QEntity();

QDiffuseMapMaterial * material = new QDiffuseMapMaterial();

QTextureImage * diffuseTextureImage = new QTextureImage();
diffuseTextureImage->setSource(QUrl("qrc:/resources/tile.png"));
material->diffuse()->addTextureImage(diffuseTextureImage);
visibleObject->addComponent(material);

// set mesh
QPlaneMesh * mesh = new QPlaneMesh();
mesh->setWidth(1.0 / 2);
mesh->setHeight(1.0 / 2);
visibleObject->addComponent(mesh);

visibleObject->setParent(_rootEntity);

delete visibleObject; 是在cpp代码中定义的场景根实体。使用Scene3D在QML文件中定义的场景:

_rootEntity

Scene3D { id: scene anchors.fill: parent aspects: ["render", "logic", "input"] entity: rootEntity } 像这样传递:

_rootEntity

如果有必要,我可以准备一个重现问题的简单例子。

感谢。

2 个答案:

答案 0 :(得分:0)

visibleObject->setParent(_rootEntity);表示_ rootEntity取得visibleObject的所有权。如果您delete visibleObject;在_ rootEntity中创建了悬空指针。见http://doc.qt.io/qt-5/objecttrees.html。所以不要delete visibleObject;

答案 1 :(得分:0)

您的问题似乎是您已经定义了如何错误删除内容,对任何问题的最佳解决方案是完全消除问题。

您是否尝试过使用智能指针?特别是共享指针?使用智能指针消除了完全挂起引用的问题,并且几乎没有任何与其使用相关的开销。 Qt甚至拥有自己专用的智能指针实现。

如果您无需明确指定删除对象,则不会出现指定删除的问题。