Мне нравится использовать Qt3D, но все примеры, которые я вижу для него, - это полные оконные приложения. Из примеров я не могу понять, как добавить окно рендеринга qt3d в обычное приложение qt gui.
В основном, что я хочу, это небольшой виджет рендеринга для моего приложения Qt5 Gui.
Я просмотрел виджет Qtgl, но я действительно хочу использовать возможности управления сценой Qt3D.
Как я могу отображать в качестве вспомогательного окна внутри окна qt Gui?
Это возможно?
Обновить
Поэтому я добавил это в свой MainWindow.cpp. Он свободно основан на этом http://blog.qt.digia.com/blog/2013/02/19/introducing-qwidgetcreatewindowcontainer/
LoadModelView *view = new LoadModelView(); //Crashes on this. Will not compile with
// LoadModelView(this)
QWidget *container = QWidget::createWindowContainer(view);
container->setFocusPolicy(Qt::TabFocus);
ui->gridLayout->addWidget(container);
который кажется правильным.
мой load_model.cpp начинается следующим образом:
#include "qglmaterialcollection.h"
#include "qglmaterial.h"
#include "qglscenenode.h"
#include "qgllightmodel.h"
#include "qglabstractscene.h"
#include <QtGui/qmatrix4x4.h>
#include <QPropertyAnimation>
#include <QtCore/qmath.h>
#define DEGREE_TO_RAD (3.1415926/180.0)
LoadModelView::LoadModelView(QWindow *parent)
: QGLView(parent)
, m_pSTLScene(0)
{
loadModels();
camera()->setCenter(QVector3D(0, 0, 0));
camera()->setEye(QVector3D(0, 4, 10));
}
LoadModelView::~LoadModelView()
{
delete m_pSTLScene;
}
void LoadModelView::paintGL(QGLPainter *painter)
{
QMatrix4x4 stlWorld;
stlWorld.setToIdentity();
stlWorld.scale(0.1);
stlWorld.translate(QVector3D(2.0,0.0,0.0));
painter->setStandardEffect(QGL::LitMaterial);
painter->setFaceColor(QGL::AllFaces,QColor(170,202,0));
painter->modelViewMatrix() = camera()->modelViewMatrix() * stlWorld;
m_pSTLScene->mainNode()->draw(painter);
}
void FixNodesRecursive(int matIndex, QGLSceneNode* pNode)
{
if (pNode) {
pNode->setMaterialIndex(matIndex);
// pNode->setEffect(QGL::FlatReplaceTexture2D);
foreach (QGLSceneNode* pCh, pNode->children()) {
FixNodesRecursive(matIndex, pCh);
}
}
}
void LoadModelView::loadModels()
{
{
m_pSTLScene = QGLAbstractScene::loadScene(QLatin1String(":/models/Sheep.stl"), QString(),"CorrectNormals CorrectAcute");
Q_ASSERT(m_pSTLScene!=0);
QGLMaterial *mat = new QGLMaterial;
mat->setAmbientColor(QColor(170,202,0));
mat->setDiffuseColor(QColor(170,202,0));
mat->setShininess(128);
QGLSceneNode* pSTLSceneRoot = m_pSTLScene->mainNode();
int matIndex = pSTLSceneRoot->palette()->addMaterial(mat);
pSTLSceneRoot->setMaterialIndex(matIndex);
pSTLSceneRoot->setEffect(QGL::FlatReplaceTexture2D);
FixNodesRecursive(matIndex,pSTLSceneRoot);
}
}
Он выходит из строя с: это приложение запросило среду выполнения, чтобы прекратить ее необычным способом.
и в выводе приложения qt: недопустимый параметр, переданный функции времени выполнения C.
EDIT Добавил остальную часть рассматриваемого класса
Я замечаю, что в этом примере я адаптирую http://doc.qt.digia.com/qt-quick3d-snapshot/qt3d-penguin-main-cpp.html окно инициализируется, говоря:
LoadModelView view;
Однако, говоря
LoadModelView *view = new LoadModelView(this)
сбой