这个问题可能与another SO question有关。在
我在运行MacOS10.11.2 El Capitan。功能丰富的许愿GUI 围绕我的OpenGL应用程序,我决定尝试一下PyQT5 创建OpenGL上下文,这样我就可以将OpenGL作为一个QtWidget集成到GUI应用程序中。在
QT5为QGlWidget提供了几种API方法,我在这里简要总结一下:
initializeGL
:在paintGL
之前调用一次paintGL
:将素材绘制到活动帧缓冲区的位置我可以创建小部件和初始化着色器等。但是当涉及到与帧缓冲区相关的操作时,例如glClear
,会出现一个错误:
File "errorchecker.pyx", line 53, in OpenGL_accelerate.errorchecker._ErrorChecker.glCheckError (src/errorchecker.c:1218)
OpenGL.error.GLError: GLError(
err = 1286,
description = 'invalid framebuffer operation',
baseOperation = glClear,
cArguments = (GL_COLOR_BUFFER_BIT,)
)
我发现一个website报告了相关问题。似乎在调用API方法时没有配置帧缓冲区。因为我觉得这应该是QT的任务,所以我没有自己配置windowframebuffer。但是我发现,在调用了一些API方法之后,framebuffer被神奇地创建了。因此,我构建了一个小的hack,它将等到paintGL
被调用NSKIP_PAINTGL=3
次。然后我配置我的对象,使正常的paintGL过程开始工作。这似乎有效。但有时它需要超过NSKIP_PAINTGL
次,所以我在工作区中加入了一点sleep
。QT似乎比它应该创建的帧缓冲区稍晚。也许QT是在一个单独的线程中完成的?QOpenGLWidget确认可能在某个时间未创建帧缓冲区:
Returns The frame buffer object handle or 0 if not yet initialized.
我不喜欢这样的工作环境,因为我害怕这里的条件提高。另外,我在这里没有太多的控制权(我需要依赖这样一个事实,即QT在一开始就足够频繁地调用paintGL,这样黑客才能工作)。我现在不熟悉QT框架,所以我的问题是:
如何创建某种循环,在创建QGLControllerWidget
时,运行try/catch
所覆盖的updateGL
方法,并在{QOpenGLWidget::defaultFramebufferObject()
并等待对象句柄。在
当然,我希望尽可能优雅地将这种方法集成到QT应用程序流中-以可爱的方式进行。在
还是我错过了什么?是否可以以某种方式设置PyQT,以便在有效的帧缓冲区存在之前它不会调用openglapi方法?在
下面是一个在我的Mac上运行的黑客代码:
^{pr2}$注意,欢迎C++代码片段,因为我会尝试转换成Python。在
在Qt5中,
QGL*
内容已被弃用。这可能就是它提前调用paintGL()
的原因。您应该改为使用QOpenGLWidget或QOpenGLWindow。在或者,您可以尝试在
paintGL()
内使用isValid()
方法,如果它返回错误值,就提前退出:如果您想尝试
^{pr2}$QOpenGLWidget
,可以将此作为起点:而且,您不需要像我一样使用Qt提供的OpenGL函数。您也可以使用}的所有内容。在
OpenGL.GL
中的普通函数,甚至可以混合匹配(Qt提供了一些很好的类,使GL的工作更容易)。如果您只想使用OpenGL.GL
,那么可以删除引用QOpenGLVersionProfile
、versionprofile
、versionFunctions
、initializeOpenGLFunctions
和{相关问题 更多 >
编程相关推荐