【问题标题】:Problems with openGL and PyQt5openGL 和 PyQt5 的问题
【发布时间】:2019-04-09 18:12:04
【问题描述】:

我正在从 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 在这方面有什么变化?

【问题讨论】:

  • 我已经在 Linux 中使用 Python 3.7 和 PyQt 5.11.2 进行了测试,我没有遇到任何问题
  • 在Windows上试试,很可能只是那里的问题。在四台 Windows 机器中,我有一台可以毫无问题地运行代码。
  • 检查你得到的 OpenGL 上下文版本。 glGenLists 十年前已从现代版本的 OpenGL 中删除。
  • 我修改了我的答案,在你的例子中加入了对 makeCurrent() 的调用,看来问题已经解决了,让我知道它对你的影响 ;-)

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


【解决方案1】:

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

GL_INVALID_OPERATION 如果 glGenLists 在 glBegin 的执行和 glEnd 的相应执行。

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

我能够通过创建一个继承自 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

【讨论】:

  • 对不起,Isma,但我在代码的第 22 行遇到了同样的错误。
  • 你用的是虚拟机吗?
  • 事实上,是的,我是。实际上有几个。很好的提示,因为现在我想起来了,代码只能在一台真实机器上运行,而不能在任何虚拟机器上运行。我刚刚在另一台真机上运行了上面的原始小示例代码,它运行良好。因此,最新的 QtOpenGL(或任何问题所在)的变化似乎与虚拟机有关。这在一定程度上缓解了我的问题,但最终我也想在虚拟机上使用代码。 (是的,我知道,最终我必须将代码转换为现代 OpenGL。)
  • 你用的是什么虚拟机。这是关键,因为其中一些不支持 OpenGL 或仅支持部分功能。
  • 它是基于 KVM 的 Windows 10。但我认为它必须是新的 Python/Qt/whatever 库而不是机器,因为我的 pre-Qt5/OpenGL 软件运行在我所有的虚拟机上有。
猜你喜欢
  • 2020-11-14
  • 2019-01-12
  • 2011-01-21
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
相关资源
最近更新 更多