2012-07-18 118 views
1

似乎在initializeGL之前调用了QGLWidget的paintEvent方法,所以我应该在哪里放置openGL初始化代码?QGLWidget paintEvent:在哪里初始化openGL?

我把它放入的paintEvent方法是这样的:

void MyGLWidget::paintEvent(...) 
{ 
    makeCurrent(); 
    ..save modelview and projection matrices.. 

    // This is initialization code 

    GLenum init = glewInit(); 
    if (GLEW_OK != init) 
    { 
     /* Problem: glewInit failed, something is seriously wrong. */ 
     qWarning() << glewGetErrorString(init); 
    } 

    // Dark blue background 
    glClearColor(0.2f, 0.0f, 0.5f, 0.0f); 
    // Enable depth test 
    glEnable(GL_DEPTH_TEST); 


    // End initialization code 

    ... drawing code 

    QPainter painter(this); 
    ...overpainting.. 

} 

我真的不喜欢被称为每次的paintEvent上升时间我GLEW库初始化函数的想法......虽然这加工。

有什么建议吗?

回答

2

你必须initializeGL(初始化OpenGL的),没有其他的选择。

但是你也必须画在paintGL里面,而不是在paintEvent里面,所以这是你的错误所在。

+0

之前没有调用initializeGL并从paintEvent调用updateGL? – 2012-07-18 19:37:52

+0

如果我从paintEvent调用“updateGL”,并让initializeGL和paintGL完成这项工作,出于某种原因,屏幕呈现正常,但之后立即全部换成白色。这是为什么? – 2012-07-18 19:52:20

0

重写QGLWidget的initializeGL()函数。这是创建适合您想

从它的文档目的:

这个虚函数第一次调用之前调用一次以 paintGL()或resizeGL(),然后一旦每当小部件有已为 分配了新的QGLContext。在一个子类中重新实现它。

链接到文件:http://doc.qt.io/archives/qt-4.7/qglwidget.html#initializeGL

+1

正如我所说,它似乎initializeGL被称为AFTER paintEvent,所以我不能绘制paintEvent没有glew扩展和着色器设置(这应该做的,在我的愚见,进入initializeGL) – 2012-07-18 17:25:44

+0

@JohnPell:对不起,我没有注意到这一点。你确定它是在绘画事件之后调用的吗?尝试在这两个函数中加入断点并检查哪一个是首先触发的 – Andrew 2012-07-18 17:37:17

+0

@JohnPell:请参阅我的编辑 – Andrew 2012-07-18 17:46:02