2017-03-07 72 views
0

我有在运行时应创建和删除的实体。实体只有材质和网格组件。材质是具有QTextureImage的QDiffuseMapMaterial。在添加和删除Qt3D中的实体时发生崩溃

当实体开始与该断言添加和删除的场景,有时应用程序崩溃:

qt_assert:ASSERT: “IMG = nullptr” 文件 ../../include/Qt3DRender/ 5.8.0/Qt3DRender /私人/../../../../../的src /渲染/纹理/ 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);

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

感谢。

回答

0

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

+0

我已经试过像这样删除它:'visibleObject-> setParent(nullptr);删除visibleObject;'但行为是一样的。无论如何,它似乎是Qt的bug(https://bugreports.qt.io/browse/QTBUG-59418)。 –

相关问题