PyQT5 OpenGL 4.1核心配置文件无效帧缓冲操作M

2024-09-24 00:32:02 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题可能与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。在


Tags: 对象方法api应用程序guiqtopengl缓冲区
1条回答
网友
1楼 · 发布于 2024-09-24 00:32:02

在Qt5中,QGL*内容已被弃用。这可能就是它提前调用paintGL()的原因。您应该改为使用QOpenGLWidgetQOpenGLWindow。在

或者,您可以尝试在paintGL()内使用isValid()方法,如果它返回错误值,就提前退出:

def paintGL(self):
    if not self.isValid():
        return

如果您想尝试QOpenGLWidget,可以将此作为起点:

^{pr2}$

而且,您不需要像我一样使用Qt提供的OpenGL函数。您也可以使用OpenGL.GL中的普通函数,甚至可以混合匹配(Qt提供了一些很好的类,使GL的工作更容易)。如果您只想使用OpenGL.GL,那么可以删除引用QOpenGLVersionProfileversionprofileversionFunctionsinitializeOpenGLFunctions和{}的所有内容。在

相关问题 更多 >