Проблемы с openGL и PyQt5 - PullRequest
       24

Проблемы с openGL и PyQt5

0 голосов
/ 06 ноября 2018

Я перехожу с 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 голосов
/ 13 ноября 2018

Согласно документации OpenGL glGenLists вернет GL_INVALID_OPERATION в следующем случае:

GL_INVALID_OPERATION генерируется, если glGenLists выполняется между выполнение glBegin и соответствующее выполнение glEnd.

Похоже, вы звоните glGenLists до инициализации OpenGL или между 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

...