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(); } |
再进一步,我将QT场景视图(Graphics-View)嵌入多文档界面,下面尝试将QT自带的boxes例子(GraphicsView With OpenGL)嵌入,相关代码如下:
C++ Code
1
2 3 4 5 6 7 8 9 10 |
// 子窗口4-GraphicsView With OpenGL
QGLWidget *widget = new QGLWidget(QGLFormat(QGL::SampleBuffers)); widget->makeCurrent(); Scene scene(1024, 768, maxTextureSize);; GraphicsView view; view.setViewport(widget); view.setViewportUpdateMode(QGraphicsView::FullViewportUpdate); view.setScene(&scene); //gview.show(); centralWidget->addSubWindow(&gview); |
我在Ubuntu中测试的一个截图效果如下: