2016-08-09 223 views
2

我想一个C++ QEntity添加到QML Scene3D,像这样:使用Qt3D QEntity在QML Scene3D

//C++ 
class MapEntity : public Qt3DCore::QEntity { 
    public: 
    MapEntity(Qt3DCore::QEntity* parent) : Qt3DCore::QEntity(parent) { 
     ... 
    } 
} 

// QML 
Scene3D { 
    MapEntity { 
     id: map 
     ... 
    } 
} 

这可能吗?如果是的话,该怎么做?

或者也许可以创建C++场景(例如Qt3DExtras :: Qt3DWindow)并在QML中使用?

回答

3

是的,可以在C++代码中定义QEntity然后使用它。在这里介绍的方法:

http://doc.qt.io/qt-5/qtqml-cppintegration-definetypes.html

首先要创建QEntity的。球例如:

class MyEntity : public Qt3DCore::QEntity { 
    public: 
     MyEntity(Qt3DCore::QEntity* parent=0) : Qt3DCore::QEntity(parent) { 
       Qt3DRender::QMaterial *material = new Qt3DExtras::QPhongMaterial; 

       Qt3DExtras::QSphereMesh *sphereMesh = new Qt3DExtras::QSphereMesh; 
       sphereMesh->setRadius(8); 

       addComponent(sphereMesh); 
       addComponent(material); 
     } 
     virtual   ~MyEntity() {} 
}; 

然后将其注册为QML组件:

qmlRegisterType<MyEntity>("com.company.my", 1, 0, "MyEntity"); 

而只是用它在QML:

Scene3D { 
    id: myScene 
    anchors.fill: parent 
    cameraAspectRatioMode: Scene3D.AutomaticAspectRatio 
    focus: true 
    enabled: true 



    Entity { 
     id: sceneRoot 

     Quick.Camera { 
      id: camera 
      projectionType: Quick.CameraLens.PerspectiveProjection 
      fieldOfView: 45 
      nearPlane : 0.1 
      farPlane : 1000.0 
      position: Qt.vector3d(0.0, 0.0, 40.0) 
      upVector: Qt.vector3d(0.0, 1.0, 0.0) 
      viewCenter: Qt.vector3d(0.0, 0.0, 0.0) 
     } 

     components: [ 
      Quick.RenderSettings { 
       activeFrameGraph: ForwardRenderer { 
        clearColor: Qt.rgba(0, 0.5, 1, 0) 
        camera: camera 
       } 
      } 
     ] 

     MyEntity { 
      id: myEnt 
     } 
    } 
} 
+1

这是有点接近链接只回答:HTTP ://stackoverflow.com/help/how-to-answer你可以做一个最小的,完整的例子作为答案(C++和QML片段)。 – Mitch

+0

@ kamil请你分享一个合适的例子吗? –