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

时间:2019-04-11 04:18:25

标签: qt opengl 3d glew qopenglwidget

我使用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并略过。我尝试过

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 ()错误。

1 个答案:

答案 0 :(得分: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