2017-03-07 18 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);は、がvisibleObjectの所有権を取ることを意味します。 delete visibleObject;の場合、_ rootEntityにダングリングポインタを作成します。 http://doc.qt.io/qt-5/objecttrees.htmlを参照してください。そうではありませんdelete visibleObject;

+0

私はすでにこのように削除しようとしました: 'visibleObject-> setParent(nullptr); delete visibleObject; 'の動作は同じです。とにかく、Qtバグ(https://bugreports.qt.io/browse/QTBUG-59418)のようです。 –

関連する問題