QGLwidget pops out from qmainwindow even if it's the mainwindow.ui

568 Views Asked by At

i have a MainWindow which displays some plots that come from widget promotion. Now i have decided that i want to embed a QGLWidget so that i can draw a 3D image near them. I created a QGLWidget inside the creator design and i have promoted it to MyGLWidget class

MyGLWidget.h

#ifndef MYGLWIDGET
#define MYGLWIDGET

#include <QtOpenGL>
#include <QGLWidget>
#include <array>

class MyGLWidget : public QGLWidget{

  Q_OBJECT // must include this if you use Qt signals/slots

public:
    explicit MyGLWidget(QWidget *parent = 0);
    std::array<GLfloat, 3> angles;   

protected:
    // Set up the rendering context, define display lists etc.:
   void initializeGL();
   // draw the scene:
   void paintGL();
   // setup viewport, projection etc.:
   void resizeGL (int width, int height);

};

#endif // MYGLWIDGET

MyGLWidget.cpp

#include "myglwidget.h"
#include <gl/GLU.h>
#include <iostream>

MyGLWidget::MyGLWidget(QWidget *parent){
    angles[0] = 50.0;
    angles[1] = 15.0;
}

/*
 * Sets up the OpenGL rendering context, defines display lists, etc.
 * Gets called once before the first time resizeGL() or paintGL() is called.
 */
void MyGLWidget::initializeGL(){
    //activate the depth buffer
    glEnable(GL_DEPTH_TEST);
}


/*
 *  Sets up the OpenGL viewport, projection, etc. Gets called whenever the widget has been resized
 *  (and also when it is shown for the first time because all newly created widgets get a resize event automatically).
 */
void MyGLWidget::resizeGL (int width, int height){
    glViewport( 0, 0, (GLint)width, (GLint)height );

    /* create viewing cone with near and far clipping planes */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 30.0);

    glMatrixMode( GL_MODELVIEW );
}



/*
 * Renders the OpenGL scene. Gets called whenever the widget needs to be updated.
 */
void MyGLWidget::paintGL(){

    //delete color and depth buffer
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);


    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0f,0.0f,-20.0f); //move along z-axis

    glRotatef(angles[0],0.0,1.0,0.0); //rotate 30 degress around y-axis
    glRotatef(angles[1],1.0,0.0,0.0); //rotate 15 degress around x-axis


    /* create 3D-Cube */
    glBegin(GL_QUADS);

    //front
    glColor3f(1.0,0.0,0.0);

    glVertex3f(1.0,1.0,1.0);
    glVertex3f(-1.0,1.0,1.0);
    glVertex3f(-1.0,-1.0,1.0);
    glVertex3f(1.0,-1.0,1.0);


    //back

    glColor3f(0.0,1.0,0.0);

    glVertex3f(1.0,1.0,-1.0);
    glVertex3f(-1.0,1.0,-1.0);
    glVertex3f(-1.0,-1.0,-1.0);
    glVertex3f(1.0,-1.0,-1.0);


    //top
    glColor3f(0.0,0.0,1.0);

    glVertex3f(-1.0,1.0,1.0);
    glVertex3f(1.0,1.0,1.0);
    glVertex3f(1.0,1.0,-1.0);
    glVertex3f(-1.0,1.0,-1.0);


    //bottom
    glColor3f(0.0,1.0,1.0);

    glVertex3f(1.0,-1.0,1.0);
    glVertex3f(1.0,-1.0,-1.0);
    glVertex3f(-1.0,-1.0,-1.0);
    glVertex3f(-1.0,-1.0,1.0);

    //right
    glColor3f(1.0,0.0,1.0);

    glVertex3f(1.0,1.0,1.0);
    glVertex3f(1.0,-1.0,1.0);
    glVertex3f(1.0,-1.0,-1.0);
    glVertex3f(1.0,1.0,-1.0);


    //left
    glColor3f(1.0,1.0,0.0);

    glVertex3f(-1.0,1.0,1.0);
    glVertex3f(-1.0,-1.0,1.0);
    glVertex3f(-1.0,-1.0,-1.0);
    glVertex3f(-1.0,1.0,-1.0);


    glEnd();
}

Now in the constructor of mainwindow.cpp i call ui->wgl->show(); where wgl is the ObjectName of the widget promoted to my class. The cube is rendered but the widget pops out from the mainwindow instead of stay where i designed it

1

There are 1 best solutions below

0
On BEST ANSWER

Your widget has no parent, but in Qt widget without parent is a separate window, so try to do this in constructor.

MyGLWidget::MyGLWidget(QWidget *parent) : QGLWidget(parent)
{
    angles[0] = 50.0;
    angles[1] = 15.0;
}

If you really use Qt Designer, then you have ui->setupUi(this); in your code. It does something like this (allocate memory and set parent):

MyGLWidget *wgl = new MyGLWidget(this);

It passes this as parent, but your current MyGLWidget take it but ignores it. So with code in my answer all should be fine.