How to embed a qwindow into qmainwindow
-
This is the main.cpp file for the basic shapes 3D example.
int main(int argc, char **argv) { QApplication app(argc, argv); Window *view = new Window(); QWidget *container = QWidget::createWindowContainer(view); QSize screenSize = view->screen()->size(); container->setMinimumSize(QSize(200, 100)); container->setMaximumSize(screenSize); QWidget *widget = new QWidget; QHBoxLayout *hLayout = new QHBoxLayout(widget); QVBoxLayout *vLayout = new QVBoxLayout(); vLayout->setAlignment(Qt::AlignTop); hLayout->addWidget(container, 1); hLayout->addLayout(vLayout); widget->setWindowTitle(QStringLiteral("Basic shapes")); Qt3D::QAspectEngine engine; engine.registerAspect(new Qt3D::QRenderAspect()); Qt3D::QInputAspect *input = new Qt3D::QInputAspect; engine.registerAspect(input); engine.initialize(); QVariantMap data; data.insert(QStringLiteral("surface"), QVariant::fromValue(static_cast<QSurface *>(view))); data.insert(QStringLiteral("eventSource"), QVariant::fromValue(view)); engine.setData(data); // Root entity Qt3D::QEntity *rootEntity = new Qt3D::QEntity(); // Camera Qt3D::QCamera *cameraEntity = new Qt3D::QCamera(rootEntity); cameraEntity->setObjectName(QStringLiteral("cameraEntity")); 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)); input->setCamera(cameraEntity); // FrameGraph Qt3D::QFrameGraph *frameGraph = new Qt3D::QFrameGraph(); Qt3D::QForwardRenderer *forwardRenderer = new Qt3D::QForwardRenderer(); forwardRenderer->setCamera(cameraEntity); forwardRenderer->setClearColor(QColor(QRgb(0x4d4d4f))); frameGraph->setActiveFrameGraph(forwardRenderer); // Setting the FrameGraph rootEntity->addComponent(frameGraph); // Scenemodifier SceneModifier *modifier = new SceneModifier(rootEntity); // Set root object of the scene engine.setRootEntity(rootEntity); // Create control widgets QCommandLinkButton *info = new QCommandLinkButton(); info->setText(QStringLiteral("Qt3D ready-made meshes")); info->setDescription(QStringLiteral("Qt3D provides several ready-made meshes, like torus, cylinder, cube and sphere.")); info->setIconSize(QSize(0,0)); QCheckBox *torusCB = new QCheckBox(widget); torusCB->setChecked(true); torusCB->setText(QStringLiteral("Torus")); 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 *sphereCB = new QCheckBox(widget); sphereCB->setChecked(true); sphereCB->setText(QStringLiteral("Sphere")); vLayout->addWidget(info); vLayout->addWidget(torusCB); vLayout->addWidget(cylinderCB); vLayout->addWidget(cuboidCB); vLayout->addWidget(sphereCB); QObject::connect(torusCB, &QCheckBox::stateChanged, modifier, &SceneModifier::enableTorus); QObject::connect(cylinderCB, &QCheckBox::stateChanged, modifier, &SceneModifier::enableCylinder); QObject::connect(cuboidCB, &QCheckBox::stateChanged, modifier, &SceneModifier::enableCuboid); QObject::connect(sphereCB, &QCheckBox::stateChanged, modifier, &SceneModifier::enableSphere); torusCB->setChecked(true); cylinderCB->setChecked(true); cuboidCB->setChecked(true); sphereCB->setChecked(true); // Show window widget->show(); widget->resize(1200, 800); // Update the aspect ratio QSize widgetSize = container->size(); float aspectRatio = float(widgetSize.width()) / float(widgetSize.height()); cameraEntity->lens()->setPerspectiveProjection(45.0f, aspectRatio, 0.1f, 1000.0f); return app.exec(); } MainWindow.cpp
What I want to do is create a ui where I create my own check boxes and embed the 3D rendering in an existing QWidget that I've placed in my mainwindow.ui (figure 1).
Figure 1
Here is the code that I used to do this:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QWindow *view = new QWindow(); QWidget *container = QWidget::createWindowContainer(view); container->setParent(ui->windowWidget); container->setMaximumSize(ui->windowWidget->size()); Qt3D::QAspectEngine engine; engine.registerAspect(new Qt3D::QRenderAspect()); Qt3D::QInputAspect *input = new Qt3D::QInputAspect; engine.registerAspect(input); engine.initialize(); QVariantMap data; data.insert(QStringLiteral("surface"), QVariant::fromValue(static_cast<QSurface *>(view))); data.insert(QStringLiteral("eventSource"), QVariant::fromValue(view)); engine.setData(data); // Root entity Qt3D::QEntity *rootEntity = new Qt3D::QEntity(); // Camera Qt3D::QCamera *cameraEntity = new Qt3D::QCamera(rootEntity); cameraEntity->setObjectName(QStringLiteral("cameraEntity")); 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)); input->setCamera(cameraEntity); // FrameGraph Qt3D::QFrameGraph *frameGraph = new Qt3D::QFrameGraph(); Qt3D::QForwardRenderer *forwardRenderer = new Qt3D::QForwardRenderer(); forwardRenderer->setCamera(cameraEntity); forwardRenderer->setClearColor(QColor(QRgb(0x4d4d4f))); frameGraph->setActiveFrameGraph(forwardRenderer); // Setting the FrameGraph rootEntity->addComponent(frameGraph); // Scenemodifier SceneModifier *modifier = new SceneModifier(rootEntity); QCheckBox *torusCB = ui->torusCB; QCheckBox *cylinderCB = ui->cylinderCB; QCheckBox *sphereCB = ui->sphereCB; QCheckBox *cuboidCB = ui->cuboidCB; torusCB->setChecked(true); cylinderCB->setChecked(true); cuboidCB->setChecked(true); sphereCB->setChecked(true); QObject::connect(torusCB, &QCheckBox::stateChanged, modifier, &SceneModifier::enableTorus); QObject::connect(cylinderCB, &QCheckBox::stateChanged, modifier, &SceneModifier::enableCylinder); QObject::connect(cuboidCB, &QCheckBox::stateChanged, modifier, &SceneModifier::enableCuboid); QObject::connect(sphereCB, &QCheckBox::stateChanged, modifier, &SceneModifier::enableSphere); // Set root object of the scene engine.setRootEntity(rootEntity); // Update the aspect ratio QSize widgetSize = container->size(); float aspectRatio = float(widgetSize.width()) / float(widgetSize.height()); cameraEntity->lens()->setPerspectiveProjection(45.0f, aspectRatio, 0.1f, 1000.0f); } MainWindow::~MainWindow() { delete ui; }
Here's my main function:
int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
What I end up with is this:
I don't get the 3D rendering to show up. How would I go about fixing this? I thought that all I would need to do is change the parent of my window container to the Qwidget I have set up on my UI.
-
Hi and welcome to devnet,
What version of Qt are you using ?
On what version of Ubuntu ? -
I'm using Qt 5.10 on Ubuntu 14.04
-
Can you test a more recent version of Qt ?
Do you also get that if you use your distribution provided Qt ? -
@nathanday89, does the unmodified Basic Shapes example work for you?
-
What about running your code using your distribution provided Qt ?
-
@nathanday89 said in How to embed a qwindow into qmainwindow:
Yes, the unmodified example works for me. I just want to embed the window that pops up inside a Qwidget in my mainwindow.ui instead of it opening a window of its own.
Then you have just made a mistake while copying+pasting the code. Your original post contained
Window *view = new Window();
-- this line does not exist in the Basic Shapes example.I recommend you make a copy of the original Basic Shapes project and gradually insert your own code into it.
The first thing to try is replace the code that shows the top-level widget with your own QMainWindow:
/* (Original code) // Show window widget->show(); widget->resize(1200, 800); */ // (Replacement code) QMainWindow myWindow; myWindow.setCentralWidget(widget); myWindow.show()