QGLWidget paintEvent:在哪里初始化openGL?
Posted
技术标签:
【中文标题】QGLWidget paintEvent:在哪里初始化openGL?【英文标题】:QGLWidget paintEvent: where to initialize openGL? 【发布时间】:2012-07-18 17:16:57 【问题描述】:好像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 库初始化函数的想法......虽然这很有效。
有什么建议吗?
【问题讨论】:
【参考方案1】:你必须在initializeGL()中初始化OpenGL,没有别的选择。
但是你还必须在paintGL 内部绘制,而不是在paintEvent 内部绘制,所以这就是你的错误所在。
【讨论】:
如果我从paintEvent 中调用“updateGL”,并让initializeGL 和paintGL 完成工作,由于某种原因,屏幕呈现正常,但随后立即被完全换成白色。这是为什么呢?【参考方案2】:重写 QGLWidget 的 initializeGL() 函数。它是为您想要的目的而创建的
来自它的文档:
这个虚函数在第一次调用之前被调用一次 paintGL() 或 resizeGL(),然后每当小部件被 分配了一个新的 QGLContext。在子类中重新实现它。
文档链接:http://doc.qt.io/archives/qt-4.7/qglwidget.html#initializeGL
【讨论】:
正如我所说,initializeGL 似乎在paintEvent 之后被调用,所以我不能在没有设置 glew 扩展和着色器的情况下在paintEvent 中绘制(以我的拙见,应该在 initializeGL 中完成)跨度> @JohnPell:对不起,我没有注意到。你确定它是在绘画事件之后调用的吗?尝试在两个函数中都设置断点,并检查哪个函数首先触发 我这样做了,这就是为什么我写了在paintEvent之后调用initializeGL的原因。这很奇怪,但看起来如此 @JohnPell:你有没有试过在初始化之前设置断点来查看是否真的调用了paint? 是的,我尝试过使用断点,并且没有必要设置断点,因为如果我将初始化代码放入 initializeGL 而将正常的绘图代码放入paintEvent,场景会崩溃,因为在paintEvent 之前未调用initializeGL以上是关于QGLWidget paintEvent:在哪里初始化openGL?的主要内容,如果未能解决你的问题,请参考以下文章