QT中自带的例子widgets-scene3d实现在基于Widget的应用程序中使用qml 3d场景的功能,我在此基础上,将basicshapes-cpp的例子加以嵌入:
相关代码如下:
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
#include
<QApplication> #include <QMainWindow> #include <QQuickWidget> #include <QMdiArea> #include <QLCDNumber> #include <QMenuBar> #include "scenemodifier.h" #include <Qt3DRender/qcamera.h> #include <Qt3DCore/qentity.h> #include <Qt3DRender/qcameralens.h> #include <Qt3DInput/QInputAspect> #include <Qt3DExtras/qtorusmesh.h> #include <Qt3DRender/qmesh.h> #include <Qt3DRender/qtechnique.h> #include <Qt3DRender/qmaterial.h> #include <Qt3DRender/qeffect.h> #include <Qt3DRender/qtexture.h> #include <Qt3DRender/qrenderpass.h> #include <Qt3DRender/qsceneloader.h> #include <Qt3DRender/qpointlight.h> #include <Qt3DCore/qtransform.h> #include <Qt3DCore/qaspectengine.h> #include <Qt3DRender/qrenderaspect.h> #include <Qt3DExtras/qforwardrenderer.h> #include <Qt3DExtras/qt3dwindow.h> #include <Qt3DExtras/qfirstpersoncameracontroller.h> int main( int argc, char **argv) { QApplication app(argc, argv); QMainWindow mainWindow; QMdiArea *centralWidget = new QMdiArea; // 子窗口1 QLCDNumber *lcd = new QLCDNumber; lcd->display( 1337 ); lcd->setMinimumSize( 250 , 100 ); centralWidget->addSubWindow(lcd); // 子窗口2 QQuickWidget *quickWidget = new QQuickWidget; quickWidget->setMinimumSize( 300 , 300 ); quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); quickWidget->setSource(QUrl( "qrc:/main.qml" )); centralWidget->addSubWindow(quickWidget); // 子窗口3 Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow(); view->defaultFrameGraph()->setClearColor(QColor(QRgb(0x4d4d4f))); QWidget *container = QWidget::createWindowContainer(view); container->setMinimumSize( 400 , 400 ); centralWidget->addSubWindow(container); Qt3DInput::QInputAspect *input = new Qt3DInput::QInputAspect; view->registerAspect(input); // Root entity Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity(); // Camera Qt3DRender::QCamera *cameraEntity = view->camera(); cameraEntity->lens()->setPerspectiveProjection( 45 .0f, 16 .0f/ 9 .0f, 0 .1f, 1000 .0f); cameraEntity->setPosition(QVector3D( 0 , 0 , 20 .0f)); cameraEntity->setUpVector(QVector3D( 0 , 1 , 0 )); cameraEntity->setViewCenter(QVector3D( 0 , 0 , 0 )); Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity(rootEntity); Qt3DRender::QPointLight *light = new Qt3DRender::QPointLight(lightEntity); light->setColor( "white" ); light->setIntensity( 1 ); lightEntity->addComponent(light); Qt3DCore::QTransform *lightTransform = new Qt3DCore::QTransform(lightEntity); lightTransform->setTranslation(cameraEntity->position()); lightEntity->addComponent(lightTransform); // For camera controls Qt3DExtras::QFirstPersonCameraController *camController = new Qt3DExtras::QFirstPersonCameraController(rootEntity); camController->setCamera(cameraEntity); // Scenemodifier SceneModifier *modifier = new SceneModifier(rootEntity); // Set root object of the scene view->setRootEntity(rootEntity); mainWindow.setCentralWidget(centralWidget); QMenu *fileMenu = mainWindow.menuBar()->addMenu(QObject::tr( "&File" )); fileMenu->addAction(QObject::tr( "E&xit" ), qApp, &QCoreApplication::quit); mainWindow.resize( 1024 , 768 ); mainWindow.show(); return app.exec(); } |