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

 

转载于:https://www.cnblogs.com/MakeView660/p/10551637.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值