我使用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 ()错误。
答案 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