openGL和PyQt5的问题

时间:2018-11-06 10:52:01

标签: python-3.x opengl pyqt pyqt5 pyopengl

我正在从Winpython3.4.3.7Qt4迁移到Winpython3.x.x.xQt5(我尝试了很多版本),但遇到以下问题:

以下最少的代码(它无用,但显示了错误):

from PyQt5 import QtWidgets
import OpenGL.GL as gl
from PyQt5.QtOpenGL import QGLWidget
qapp = QtWidgets.QApplication([])
window = QGLWidget()
window.makeCurrent()
index = gl.glGenLists(1)
print(index)

使用Winpython3.4.3.7Qt4在我的所有计算机上运行,​​并显示'1'。当我使用Winpython3.x.x.xQt5时,它不再在我的虚拟机上运行。我得到的错误是:

Traceback (most recent call last):
  File ".\opengl.py", line 12, in <module>
    index = gl.glGenLists(1)
  File "C:\Winpython-64bit-3.6.7.0\python-3.6.7\lib\site-packages\OpenGL\platform\baseplatform.py", line 405, in __call__
    return self( *args, **named )
  File "C:\Winpython-64bit-3.6.7.0\python-3.6.7\lib\site-packages\OpenGL\error.py", line 232, in glCheckError
    baseOperation = baseOperation,
OpenGL.error.GLError: GLError(
        err = 1282,
        description = b'invalid operation',
        baseOperation = glGenLists,
        cArguments = (1,),
        result = 0
)

我感觉window.makeCurrent()没有通过,但是我不知道为什么。从Qt4到Qt5在这方面发生了什么变化?

1 个答案:

答案 0 :(得分:1)

在以下情况下,根据OpenGL文档glGenLists将返回GL_INVALID_OPERATION

  如果在两次之间执行glGenLists,则生成

GL_INVALID_OPERATION   glBegin的执行以及glEnd的相应执行。

因此,看来您是在初始化OpenGL之前或在glGenLists glBegin绘图调用之间调用glEnd

我能够通过创建一个继承自QGLWidget的小部件并等待直到其初始化之后再调用gl.glGenLists(1)来解决该问题,正如您可以看到的,在init方法内部发送了一个信号:

import sys
import OpenGL.GL as gl

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import pyqtSignal

from PyQt5.QtOpenGL import QGLWidget


class MyQGLWidget(QGLWidget):
    init = pyqtSignal()

    def __init__(self, parent=None):
        super().__init__(parent)

    def glInit(self):
        super().glInit()
        self.init.emit()

    def gl_gen_lists(self, size):
        return gl.glGenLists(size)


class App(QApplication):
    def __init__(self, sys_argv):
        super().__init__(sys_argv)
        self.qgl_widget = MyQGLWidget()
        self.qgl_widget.init.connect(self.on_init)
        self.qgl_widget.show()

    def on_init(self):
        self.qgl_widget.makeCurrent()
        print(self.qgl_widget.gl_gen_lists(1))


if __name__ == '__main__':
    app = App(sys.argv)
    sys.exit(app.exec_())

错误消失了...

参考:http://docs.gl/gl3/glGenLists