1

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

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

qt_assert:断言:文件../../include/Qt3DRender/5.8.0/Qt3DRender/private/../../../../../src/render/texture中的“img!= nullptr” /apitexturemanager_p.h,第 286 行

但不幸的是,我无法弄清楚为什么会这样。我以这种方式添加实体:

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;

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

 Scene3D {
     id: scene
     anchors.fill: parent
     aspects: ["render", "logic", "input"]

     entity: rootEntity
 }

_rootEntity像这样通过:

context->setContextProperty("rootEntity", _rootEntity);

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

谢谢。

4

2 回答 2

1

该行visibleObject->setParent(_rootEntity);表示 _rootEntity拥有visibleObject. 如果您delete visibleObject;在 _ 中创建一个悬空指针rootEntity。请参阅http://doc.qt.io/qt-5/objecttrees.html。所以不要delete visibleObject;

于 2017-04-14T07:50:12.113 回答
0

看来您的麻烦在于您已经定义了如何错误地删除内容,任何问题的最佳解决方案都是完全消除问题。

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

如果您消除了显式指定删除对象的必要性,则指定删除不会有问题。

于 2018-05-28T18:11:40.430 回答