QGLWidget paintEvent:在哪里初始化openGL?

时间:2012-07-18 17:16:58

标签: c++ qt opengl graphics qglwidget

似乎QGLWidget的paintEvent方法在initializeGL之前被调用,所以我应该在哪里放置我的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 个答案:

答案 0 :(得分:2)

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

但是你还必须在paintGL内画画,而不是在paintEvent中画画,这就是你的错误所在。

答案 1 :(得分:0)

覆盖QGLWidget的initializeGL()函数。它是为了您想要的目的而创建的

从它的文档:

  

在第一次调用之前调用此虚函数一次   paintGL()或resizeGL(),然后每当widget出现时   分配了一个新的QGLContext。在子类中重新实现它。

指向文档的链接:http://doc.qt.io/archives/qt-4.7/qglwidget.html#initializeGL