Qt例程代码分析之basicshapes-cpp

由于毕业设计设计机器人仿真,但一直想学习Qt。于是,痛下决心,从MFC平台转移到Qt上来。现在开始学习如何使用Qt 3D做一个机器人仿真环境出来。分析了一下教程的例程,不是很难,但为了以后查阅方便,所以现在这里。

下面是例程的运行结果:
例程运行界面
我选择这个例子是因为许多例程中直接是显示模型出来的,但没有提到如何结合按钮来实现一些交互。这个例子就很好,便于学习。

#include "scenemodifier.h"

#include <QGuiApplication>

#include <Qt3DRender/qcamera.h>
#include <Qt3DCore/qentity.h>
#include <Qt3DRender/qcameralens.h>
//界面需要的头文件
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QCommandLinkButton>
#include <QtGui/QScreen>
//Qt3D头文件,具体作用后续再讲
#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);
    //首先创建一个场景,用于显示你要绘制或者导入模型,关键语句
    Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow();
    //设置场景背景颜色
    view->defaultFrameGraph()->setClearColor(QColor(QRgb(0x4d4d4f)));
    //如果将3d放置在界面中,则需要创建一个widget来“装”它,container这名字起得生动
    QWidget *container = QWidget::createWindowContainer(view);
    //设置场景大小
    QSize screenSize = view->screen()->size();
    //当你缩小对话框时,你希望它最小是多少
    container->setMinimumSize(QSize(100, 200));
    //当你缩小对话框时,你希望它最大是多少
    container->setMaximumSize(screenSize);

    //关键语句,创建对话框
    QWidget *widget = new QWidget;
    //水平布局
    QHBoxLayout *hLayout = new QHBoxLayout(widget);
    //垂直布局
    QVBoxLayout *vLayout = new QVBoxLayout();
    vLayout->setAlignment(Qt::AlignTop);
    //将3d场景veiw放到widget中,关键语
    hLayout->addWidget(container, 1);
    hLayout->addLayout(vLayout);

    widget->setWindowTitle(QStringLiteral("Basic shapes"));
    //不懂
    Qt3DInput::QInputAspect *input = new Qt3DInput::QInputAspect;
    view->registerAspect(input);

    //创建根实体,我理解就是创建一个基础实体,然后用它来创建其他的实体
    Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();

    // 创建相机,设置视角
    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);

    // 设置相机控制,什么第一视场什么的,不是很懂,待补充。
    Qt3DExtras::QFirstPersonCameraController *camController = new Qt3DExtras::QFirstPersonCameraController(rootEntity);
    camController->setCamera(cameraEntity);

    //场景修改?
    SceneModifier *modifier = new SceneModifier(rootEntity);

    // 关键语句,将这么多实体加载进view当中...
    view->setRootEntity(rootEntity);

    //手工码控件
    QCommandLinkButton *info = new QCommandLinkButton();
    info->setText(QStringLiteral("Qt3D ready-made meshes"));
    info->setDescription(QString::fromLatin1("Qt3D provides several ready-made meshes, like torus, cylinder, cone, "
                                             "cube, plane and sphere."));
    info->setIconSize(QSize(0,0));


    QCheckBox *torusCB = new QCheckBox(widget);
    torusCB->setChecked(true);
    torusCB->setText(QStringLiteral("Torus"));

    QCheckBox *coneCB = new QCheckBox(widget);
    coneCB->setChecked(true);
    coneCB->setText(QStringLiteral("Cone"));

    QCheckBox *cylinderCB = new QCheckBox(widget);
    cylinderCB->setChecked(true);
    cylinderCB->setText(QStringLiteral("Cylinder"));

    QCheckBox *cuboidCB = new QCheckBox(widget);
    cuboidCB->setChecked(true);
    cuboidCB->setText(QStringLiteral("Cuboid"));

    QCheckBox *planeCB = new QCheckBox(widget);
    planeCB->setChecked(true);
    planeCB->setText(QStringLiteral("Plane"));

    QCheckBox *sphereCB = new QCheckBox(widget);
    sphereCB->setChecked(true);
    sphereCB->setText(QStringLiteral("Sphere"));

    //
    vLayout->addWidget(info);
    vLayout->addWidget(torusCB);
    vLayout->addWidget(coneCB);
    vLayout->addWidget(cylinderCB);
    vLayout->addWidget(cuboidCB);
    vLayout->addWidget(planeCB);
    vLayout->addWidget(sphereCB);

    //信号与槽好基友,根据checkBox的状态来选择是否显示模型
    QObject::connect(torusCB, &QCheckBox::stateChanged,
                     modifier, &SceneModifier::enableTorus);
    QObject::connect(coneCB, &QCheckBox::stateChanged,
                     modifier, &SceneModifier::enableCone);
    QObject::connect(cylinderCB, &QCheckBox::stateChanged,
                     modifier, &SceneModifier::enableCylinder);
    QObject::connect(cuboidCB, &QCheckBox::stateChanged,
                     modifier, &SceneModifier::enableCuboid);
    QObject::connect(planeCB, &QCheckBox::stateChanged,
                     modifier, &SceneModifier::enablePlane);
    QObject::connect(sphereCB, &QCheckBox::stateChanged,
                     modifier, &SceneModifier::enableSphere);

    //先设置默认情况
    torusCB->setChecked(true);
    coneCB->setChecked(true);
    cylinderCB->setChecked(true);
    cuboidCB->setChecked(true);
    planeCB->setChecked(true);
    sphereCB->setChecked(true);

    //显示窗口
    widget->show();
    //设置大小
    widget->resize(1200, 800);

    //雷打不动第二句
    return app.exec();
}

分析得简单粗暴,但会继续研究这个代码,并且不断更新,直到自己对这里的每一句都非常熟悉!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值