2017-10-19 28 views
0

Je tente de rendre un composant QML sur la face d'un cuboïde ou d'un plan dans une scène Scene3D. J'ai suivi l'exemple dans la documentation avec succès, mais j'essaye de convertir ceci à l'API C++ car il y a plus que je dois faire avec lui et seulement C++ suffira. C'est le ctor pour ma classe, qui configure l'Entité et ses composants, en se basant sur l'exemple de code. J'inclus seulement le ctor pour la brièveté. Il n'y a rien d'autre dans la classe qui devrait l'affecter.Qt3D QtQuick Scene2D en utilisant C++

ESEctoPointToast::ESEctoPointToast(Qt3DCore::QNode *parent) 
: Qt3DCore::QEntity(parent) 
, m_position(QVector3D(0,0,0)) 
, m_quickItem(nullptr) 
, m_cuboid(new Qt3DExtras::QCuboidMesh()) 
, m_textureMaterial(new Qt3DExtras::QTextureMaterial()) 
, m_transform(new Qt3DCore::QTransform()) 
, m_objectPicker(new Qt3DRender::QObjectPicker()) 
, m_texture2d(new Qt3DRender::QTexture2D()) 
, m_renderTargetOutput(new Qt3DRender::QRenderTargetOutput()) 
, m_scene2d(new Qt3DRender::Quick::QScene2D()) 
{ 
    // g_RootQmlObject is the root item in the main scene, this was the only 
    // way I could come up with to access qmlEngine. Is there a better way? 
    auto engine = qmlEngine(g_RootQmlObject); 
    QQmlComponent c(engine, QUrl("qrc:/components/E3DDummy.qml")); 
    m_quickItem = qobject_cast<QQuickItem*>(c.create()); 
    Q_ASSERT(m_quickItem); 

    m_texture2d->setWidth(256); 
    m_texture2d->setHeight(256); 
    m_texture2d->setFormat(Qt3DRender::QAbstractTexture::TextureFormat::RGB8_UNorm); 
    m_texture2d->setGenerateMipMaps(true); 
    m_texture2d->setMagnificationFilter(Qt3DRender::QAbstractTexture::Filter::Linear); 
    m_texture2d->setMinificationFilter(Qt3DRender::QAbstractTexture::Filter::LinearMipMapLinear); 
    m_texture2d->setWrapMode(Qt3DRender::QTextureWrapMode(Qt3DRender::QTextureWrapMode::ClampToEdge)); 
    m_renderTargetOutput->setAttachmentPoint(Qt3DRender::QRenderTargetOutput::AttachmentPoint::Color0); 
    m_renderTargetOutput->setTexture(m_texture2d); 
    m_textureMaterial->setTexture(m_texture2d); 
    m_scene2d->setItem(m_quickItem); 
    m_scene2d->setMouseEnabled(true); 
    m_scene2d->setRenderPolicy(Qt3DRender::Quick::QScene2D::RenderPolicy::Continuous); 
    m_scene2d->setOutput(m_renderTargetOutput); 
    m_scene2d->addEntity(this); 

    addComponent(m_transform); 
    addComponent(m_textureMaterial); 
    addComponent(m_cuboid); 
    addComponent(m_objectPicker); 
} 

j'inclure dans mon Scene3D d'une autre classe où il rend comme une boîte noire avec un non-sens du texte en rouge serré sur le visage. De toute évidence, ce n'est pas correct. Où ai-je mal tourné?

C'est ce qui est rendu: I'm getting a black box with red garbage text, however the text is the same every time.

+0

La partie g_RootQmlObject d'un moteur QQmlEngine existant est-elle en cours d'exécution? Si ce n'est pas le cas, vous pouvez démarrer un nouveau QQmlEngine. Voir l'exemple sous "Description détaillée" ici: http://doc.qt.io/qt-5/qqmlengine.html – dragly

+0

Oui, g_RootQmlObject est en cours d'exécution. Cependant, je vais essayer de démarrer un nouveau QQmlEngine juste au cas où. –

+0

Malheureusement, non. créer un nouveau QQmlEngine donne le même résultat. –

Répondre