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

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

本文关键字:mainwindow ui qmainwindow 弹出 QGLwidget      更新时间:2023-10-16

我有一个主窗口,它显示一些来自小部件推广的图。现在我决定要嵌入一个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();
}

现在在主窗口的构造函数中.cpp我调用 ui->wgl->show((; 其中 wgl 是提升到我的类的小部件的 ObjectName。多维数据集被渲染,但小部件从主窗口中弹出,而不是停留在我设计它的地方

你的小部件没有父级,但是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接受它,但忽略它。因此,在我的答案中使用代码,一切都应该没问题。