我使用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()错误。
我发现问题是没有创建上下文,并且当程序调用函数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