QGLwidget从qmainwindow弹出,即使它是mainwindow.ui

时间:2014-12-22 10:20:57

标签: c++ qt opengl qglwidget

我有一个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-&gt; wgl-&gt; show();其中wgl是提升到我的类的小部件的ObjectName。 渲染立方体但是小部件从主窗口弹出而不是停留在我设计的位置

1 个答案:

答案 0 :(得分:4)

您的小部件没有父级,但在没有父级的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接受它但忽略它。所以我的回答中的代码都应该没问题。