我有应该在运行时创建和删除的实体。实体只有材质和网格组件。材质是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
如果有必要,我可以准备一个重现问题的简单例子。
感谢。
答案 0 :(得分:0)
行visibleObject->setParent(_rootEntity);
表示_ rootEntity
取得visibleObject
的所有权。如果您delete visibleObject;
在_ rootEntity
中创建了悬空指针。见http://doc.qt.io/qt-5/objecttrees.html。所以不要delete visibleObject;
答案 1 :(得分:0)
您的问题似乎是您已经定义了如何错误删除内容,对任何问题的最佳解决方案是完全消除问题。
您是否尝试过使用智能指针?特别是共享指针?使用智能指针消除了完全挂起引用的问题,并且几乎没有任何与其使用相关的开销。 Qt甚至拥有自己专用的智能指针实现。
如果您无需明确指定删除对象,则不会出现指定删除的问题。