调用glewInit()时Qt QOpenGLWidget崩溃,错误:缺少GL版本

问题描述 投票:0回答:1

我使用Qt用GLEW创建一个3D程序。当我从运行时创建Widget调用glewInit()时遇到问题。我基于QOpenGLWidget创建了一个继承的类MyRender。然后,使用实现initializeGL()

GLenum err;
if( err = glewInit() )
{
    printf( "error because: %s\n", glewGetErrorString( err )  );
    exit(123);
}

通常,我通过Qt Designer使用类MyRender并将QOpenGLWidget提升为MyRender。然后我会在程序启动后拥有MyRender对象。没有问题。

但是,当我在运行时创建MyRender时。例如;

MyRender * myrender = new MyRender ( this );

调用glewInit()时程序会崩溃

Missing GL version   // glewInit() problem

我找到了与this有同样问题的人

但是,在帖子中,人们使用GLUT或SDL来创建上下文。由于我只使用GLEW,我怎么能以与QOpenglWidget相同的方式制作上下文

glutInitDisplayMode(GLUT_RGB); //use GLUT 

要么

sf::Window   App(sf::VideoMode(400, 400, 32), "Window"); //use SDL 

要么

glfwMakeContextCurrent    // use glfw

因为我没有使用它们。我只使用QOpenGLWidget和glew。我试过了

myrender->makeCurrent(); // fail
myrender->initializeGL(); // fail

在打电话之前

glewInit()

然而,问题仍然存在。

关于我的机器:我使用Windows 10 64位。 Qt 5.11 GLEW 2.1.0

编辑:

我测试我的代码

 void initializeGL()
 {
        echo("inside initializeGL");

        QOpenGLContext* current = this->context();
        if( current == nullptr )
        {
            printf("current context is null\n");
            exit(123);
        }
        else
        {
           printf("current context is good\n");
        }

        GLenum err = glewInit();  // error here
        ...
 }

如果我使用Qt Designer将OpenGLWidget推广到MyRender。上下文会好的;但是,如果我在运行时创建MyRender

MyRender* myrender = new MyRender( this );

上下文将为null并导致glewInit()错误。

qt opengl 3d glew qopenglwidget
1个回答
0
投票

我发现问题是没有创建上下文,并且当程序调用函数initializeGL()时。我做的解决方案是调用show();创建窗口小部件后。

myrender = new MyRender( ui->mdiArea );
myrender->show(); // this line make the context for QOpenGLWidget I think..

... 
// note class MyRender is an inherited class from QOpenGLWidget
© www.soinside.com 2019 - 2024. All rights reserved.