• QT 中Widgets-Scene3d例子学习


    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(
    250100);
        centralWidget->addSubWindow(lcd);
        
    // 子窗口2
        QQuickWidget *quickWidget = new QQuickWidget;
        quickWidget->setMinimumSize(
    300300);
        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(
    400400);
        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(
    0020.0f));
        cameraEntity->setUpVector(QVector3D(
    010));
        cameraEntity->setViewCenter(QVector3D(
    000));

        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(
    1024768);
        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中测试的一个截图效果如下:

  • 相关阅读:
    数组
    课堂验证性实验总结
    《大道至简》第二章读后感
    大道至简第一章伪代码
    大道至简
    python学习笔记1
    19maven依赖冲突
    18SSM资源整合2
    18SSM资源整合
    17mybatis注解开发
  • 原文地址:https://www.cnblogs.com/MakeView660/p/10551637.html
Copyright © 2020-2023  润新知