QGLWidget paintEvent:在哪里初始化openGL

QGLWidget paintEvent: where to initialize openGL?

本文关键字:初始化 openGL 在哪里 paintEvent QGLWidget      更新时间:2023-10-16

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库初始化函数。。。尽管这是有效的。

有什么建议吗?

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

但你也必须在paintGL中绘制,而不是在paintEvent中绘制,所以这就是你的错误所在。

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

从它的文件:

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

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