似乎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库初始化函数的想法......虽然这有效。
有什么建议吗?
答案 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