QGLwidget выскакивает из qmainwindow, даже если это mainwindow.ui

У меня есть MainWindow, в котором отображаются некоторые графики, полученные в результате продвижения виджета. Теперь я решил, что хочу встроить QGLWidget, чтобы рядом с ними можно было рисовать 3D-изображение. Я создал QGLWidget в дизайне создателя и повысил его до класса MyGLWidget.

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();
}

Теперь в конструкторе mainwindow.cpp я вызываю ui->wgl->show(); где wgl — это имя объекта виджета, переведенного в мой класс. Куб визуализируется, но виджет выскакивает из главного окна вместо того, чтобы оставаться там, где я его разработал.


person user217354    schedule 22.12.2014    source источник


Ответы (1)


У вашего виджета нет родителя, но в Qt виджете без родителя есть отдельное окно, поэтому попробуйте сделать это в конструкторе.

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

Если вы действительно используете Qt Designer, то в вашем коде есть ui->setupUi(this);. Он делает что-то вроде этого (выделяет память и устанавливает родителя):

MyGLWidget *wgl = new MyGLWidget(this);

Он передает this в качестве родителя, но ваш текущий MyGLWidget принимает его, но игнорирует. Так что с кодом в моем ответе все должно быть в порядке.

person Kosovan    schedule 22.12.2014