QT 中Widgets-Scene3d例子学习

博客介绍了在QT中利用自带例子widgets - scene3d实现在基于Widget的应用程序中使用qml 3d场景功能,还嵌入basicshapes - cpp例子。进一步将QT场景视图嵌入多文档界面,并尝试嵌入boxes例子,最后给出在Ubuntu中的测试截图效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值