Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt5和x27的问题;s OpenGL模块和版本控制(调用不正确的QOpenGLFunctions_Uver))_Python_Opengl_Pyqt_Pyopengl - Fatal编程技术网

Python PyQt5和x27的问题;s OpenGL模块和版本控制(调用不正确的QOpenGLFunctions_Uver))

Python PyQt5和x27的问题;s OpenGL模块和版本控制(调用不正确的QOpenGLFunctions_Uver)),python,opengl,pyqt,pyopengl,Python,Opengl,Pyqt,Pyopengl,我一直在尝试编译。当我尝试构建解决方案时,我得到: Traceback (most recent call last): File "C:\Users\\-PATH-\trunk\view\test.py", line 142, in initializeGL self.gl = self.context().versionFunctions() ImportError: No module named 'PyQt5._QOpenGLFunctions_4_3_Compatibili

我一直在尝试编译。当我尝试构建解决方案时,我得到:

Traceback (most recent call last):
  File "C:\Users\\-PATH-\trunk\view\test.py", line 142, in initializeGL
    self.gl = self.context().versionFunctions()
ImportError: No module named 'PyQt5._QOpenGLFunctions_4_3_Compatibility'
[Finished in 0.3s]
在我的PyQt5文件夹中,我有:

_QOpenGLFunctions_4_1_Core.pyd
_QOpenGLFunctions_2_0.pyd
_QOpenGLFunctions_2_1.pyd
作为不同版本的QOPENGLFUNCTION集合。我试图搜索call versionFunctions()的工作原理,看看是否可以强制它使用4_1_核心文件,但没有结果。我已经重新安装了两次PyQt5,在重新启动了两次之后,看看这是否是一个奇怪的注册表骗局——这是在我确保更新了我的图形驱动程序,使OpenGL的正确版本甚至出现在我的系统上之后(如果这导致了问题的话)

PyOpenGL已经安装并更新,我也重新安装了它


我的最终目标是将OpenGL渲染器嵌入到Qt窗口中,但我还没有找到很多关于如何在python中实现这一点的示例。我使用Vispy有一段时间了,但是也遇到了很多问题,因为它们以前的Qt示例也不再有效。

这就是使用这两行代码的问题:

    self.gl = self.context().versionFunctions()
    self.gl.initializeOpenGLFunctions()
相反,您应该创建一个具有适当主/次版本的定制QSurfaceFormat,并使用QContext的setFormat使其与合适的opengl版本一起工作

无论如何,我推荐你一个简单得多的选择。对于我所有的pyqt opengl项目,我只是直接在我的小部件上使用,并且我免费获得最新的opengl版本。下面的hellogl示例适合直接使用PyOpengl,我还添加了一些例程来打印您的gpu信息,这样您就可以看到所使用的opengl版本与您的系统版本相匹配(请使用或类似工具查看):

导入系统 输入数学 从PyQt5.QtCore导入pyqtSignal、QPoint、QSize、Qt 从PyQt5.QtGui导入QColor 从PyQt5.QtWidgets导入(QApplication、QHBoxLayout、QOpenGLWidget、QSlider、, QWidget) 将OpenGL.GL作为GL导入 类窗口(QWidget): 定义初始化(自): 超级(窗口,自我)。\uuuu初始化 self.glWidget=glWidget() self.xSlider=self.createSlider() self.ySlider=self.createSlider() self.zSlider=self.createSlider() self.xSlider.valueChanged.connect(self.glWidget.setXRotation) self.glWidget.xRotationChanged.connect(self.xSlider.setValue) self.ySlider.valueChanged.connect(self.glWidget.setyrotion) self.glWidget.yRotationChanged.connect(self.ySlider.setValue) self.zSlider.valueChanged.connect(self.glWidget.setZRotation) self.glWidget.zRotationChanged.connect(self.zSlider.setValue) mainLayout=QHBoxLayout() mainLayout.addWidget(self.glWidget) mainLayout.addWidget(self.xSlider) mainLayout.addWidget(self.ySlider) mainLayout.addWidget(self.zSlider) self.setLayout(主布局) self.xSlider.setValue(15*16) self.ySlider.setValue(345*16) self.zSlider.setValue(0*16) self.setWindowTitle(“Hello GL”) def CreateSloider(自): 滑块=QSlider(Qt.垂直) 滑块。设置范围(0,360*16) 滑块。设置单级步骤(16) 滑块。设置页面步长(15*16) 滑块。设置滴答声间隔(15*16) 滑块设置滴答声位置(QSlider.TicksRight) 返回滑块 类GLWidget(QOpenGLWidget): xRotationChanged=pyqtSignal(int) yRotationChanged=pyqtSignal(int) zRotationChanged=pyqtSignal(int) def uuu init uuu(self,parent=None): super(GLWidget,self)。\uuuuu init\uuuuuuu(父级) self.object=0 self.xRot=0 self.yRot=0 self.zRot=0 self.lastPos=QPoint() self.trollectechgreen=QColor.fromCmykF(0.40,0.0,1.0,0.0) self.trollectechpurple=QColor.fromCmykF(0.39,0.39,0.0,0.0) def getOpenglInfo(自身): info=”“” 供应商:{0} 渲染器:{1} OpenGL版本:{2} 着色器版本:{3} “”格式( 总账GLGETSING(总账GLU供应商), gl.glGetString(gl.gl_渲染器), gl.glGetString(gl.gl_版本), gl.glGetString(gl.gl\u着色\u语言\u版本) ) 返回信息 def最小尺寸(自身): 返回QSize(50,50) def sizeHint(自身): 返回QSize(400400) def设置X旋转(自身、角度): 角度=自规范化角度(角度) 如果角度!=self.xRot: self.xRot=角度 self.xRotationChanged.emit(角度) self.update() def设置旋转(自身、角度): 角度=自规范化角度(角度) 如果角度!=self.yRot: self.yRot=角度 自旋转变化发射(角度) self.update() def设置旋转(自身、角度): 角度=自规范化角度(角度) 如果角度!=self.zRot: self.zRot=角度 self.zRotationChanged.emit(角度) self.update() def初始化EGL(自身): 打印(self.getOpenglInfo()) self.setClearColor(self.purple.darker()) self.object=self.makeObject() gl.glShadeModel(gl.gl\U平面) glEnable总包(总包深度测试) glEnable总图(gl.Glu CULL_面) def paintGL(自我): gl.glClear( gl.gl_颜色_缓冲_位| gl.gl_深度_缓冲_位) gl.glLoadIdentity() gl.GLT(0.0,0.0,-10.0) gl.GLROT(self.xRot/16.0,1.0,0.0,0.0) gl.gl旋转(self.yRot/16.0,0.0,1.0,0.0) gl.gl旋转(self.zRot/16.0,0.0,0.0,1.0) gl.glCallList(self.object) def resizeGL(自身、宽度、高度): 侧面=最小值(宽度、高度) 如果边<0: 返回 gl.glViewport((宽度-侧面)//2,(高度-侧面)//2,侧面, (侧面) gl.glMatrixMode(gl.gl\u投影) gl.glLoadIdentity() 格洛托总账(-0.5,0.5,0.5,-0.5,4.0,15.0) gl.glMatrixMode(gl.gl\u模型视图) def鼠标压力事件(自身、事件):
import sys
import math

from PyQt5.QtCore import pyqtSignal, QPoint, QSize, Qt
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import (QApplication, QHBoxLayout, QOpenGLWidget, QSlider,
                             QWidget)

import OpenGL.GL as gl


class Window(QWidget):

    def __init__(self):
        super(Window, self).__init__()

        self.glWidget = GLWidget()

        self.xSlider = self.createSlider()
        self.ySlider = self.createSlider()
        self.zSlider = self.createSlider()

        self.xSlider.valueChanged.connect(self.glWidget.setXRotation)
        self.glWidget.xRotationChanged.connect(self.xSlider.setValue)
        self.ySlider.valueChanged.connect(self.glWidget.setYRotation)
        self.glWidget.yRotationChanged.connect(self.ySlider.setValue)
        self.zSlider.valueChanged.connect(self.glWidget.setZRotation)
        self.glWidget.zRotationChanged.connect(self.zSlider.setValue)

        mainLayout = QHBoxLayout()
        mainLayout.addWidget(self.glWidget)
        mainLayout.addWidget(self.xSlider)
        mainLayout.addWidget(self.ySlider)
        mainLayout.addWidget(self.zSlider)
        self.setLayout(mainLayout)

        self.xSlider.setValue(15 * 16)
        self.ySlider.setValue(345 * 16)
        self.zSlider.setValue(0 * 16)

        self.setWindowTitle("Hello GL")

    def createSlider(self):
        slider = QSlider(Qt.Vertical)

        slider.setRange(0, 360 * 16)
        slider.setSingleStep(16)
        slider.setPageStep(15 * 16)
        slider.setTickInterval(15 * 16)
        slider.setTickPosition(QSlider.TicksRight)

        return slider


class GLWidget(QOpenGLWidget):
    xRotationChanged = pyqtSignal(int)
    yRotationChanged = pyqtSignal(int)
    zRotationChanged = pyqtSignal(int)

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

        self.object = 0
        self.xRot = 0
        self.yRot = 0
        self.zRot = 0

        self.lastPos = QPoint()

        self.trolltechGreen = QColor.fromCmykF(0.40, 0.0, 1.0, 0.0)
        self.trolltechPurple = QColor.fromCmykF(0.39, 0.39, 0.0, 0.0)

    def getOpenglInfo(self):
        info = """
            Vendor: {0}
            Renderer: {1}
            OpenGL Version: {2}
            Shader Version: {3}
        """.format(
            gl.glGetString(gl.GL_VENDOR),
            gl.glGetString(gl.GL_RENDERER),
            gl.glGetString(gl.GL_VERSION),
            gl.glGetString(gl.GL_SHADING_LANGUAGE_VERSION)
        )

        return info

    def minimumSizeHint(self):
        return QSize(50, 50)

    def sizeHint(self):
        return QSize(400, 400)

    def setXRotation(self, angle):
        angle = self.normalizeAngle(angle)
        if angle != self.xRot:
            self.xRot = angle
            self.xRotationChanged.emit(angle)
            self.update()

    def setYRotation(self, angle):
        angle = self.normalizeAngle(angle)
        if angle != self.yRot:
            self.yRot = angle
            self.yRotationChanged.emit(angle)
            self.update()

    def setZRotation(self, angle):
        angle = self.normalizeAngle(angle)
        if angle != self.zRot:
            self.zRot = angle
            self.zRotationChanged.emit(angle)
            self.update()

    def initializeGL(self):
        print(self.getOpenglInfo())

        self.setClearColor(self.trolltechPurple.darker())
        self.object = self.makeObject()
        gl.glShadeModel(gl.GL_FLAT)
        gl.glEnable(gl.GL_DEPTH_TEST)
        gl.glEnable(gl.GL_CULL_FACE)

    def paintGL(self):
        gl.glClear(
            gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
        gl.glLoadIdentity()
        gl.glTranslated(0.0, 0.0, -10.0)
        gl.glRotated(self.xRot / 16.0, 1.0, 0.0, 0.0)
        gl.glRotated(self.yRot / 16.0, 0.0, 1.0, 0.0)
        gl.glRotated(self.zRot / 16.0, 0.0, 0.0, 1.0)
        gl.glCallList(self.object)

    def resizeGL(self, width, height):
        side = min(width, height)
        if side < 0:
            return

        gl.glViewport((width - side) // 2, (height - side) // 2, side,
                           side)

        gl.glMatrixMode(gl.GL_PROJECTION)
        gl.glLoadIdentity()
        gl.glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0)
        gl.glMatrixMode(gl.GL_MODELVIEW)

    def mousePressEvent(self, event):
        self.lastPos = event.pos()

    def mouseMoveEvent(self, event):
        dx = event.x() - self.lastPos.x()
        dy = event.y() - self.lastPos.y()

        if event.buttons() & Qt.LeftButton:
            self.setXRotation(self.xRot + 8 * dy)
            self.setYRotation(self.yRot + 8 * dx)
        elif event.buttons() & Qt.RightButton:
            self.setXRotation(self.xRot + 8 * dy)
            self.setZRotation(self.zRot + 8 * dx)

        self.lastPos = event.pos()

    def makeObject(self):
        genList = gl.glGenLists(1)
        gl.glNewList(genList, gl.GL_COMPILE)

        gl.glBegin(gl.GL_QUADS)

        x1 = +0.06
        y1 = -0.14
        x2 = +0.14
        y2 = -0.06
        x3 = +0.08
        y3 = +0.00
        x4 = +0.30
        y4 = +0.22

        self.quad(x1, y1, x2, y2, y2, x2, y1, x1)
        self.quad(x3, y3, x4, y4, y4, x4, y3, x3)

        self.extrude(x1, y1, x2, y2)
        self.extrude(x2, y2, y2, x2)
        self.extrude(y2, x2, y1, x1)
        self.extrude(y1, x1, x1, y1)
        self.extrude(x3, y3, x4, y4)
        self.extrude(x4, y4, y4, x4)
        self.extrude(y4, x4, y3, x3)

        NumSectors = 200

        for i in range(NumSectors):
            angle1 = (i * 2 * math.pi) / NumSectors
            x5 = 0.30 * math.sin(angle1)
            y5 = 0.30 * math.cos(angle1)
            x6 = 0.20 * math.sin(angle1)
            y6 = 0.20 * math.cos(angle1)

            angle2 = ((i + 1) * 2 * math.pi) / NumSectors
            x7 = 0.20 * math.sin(angle2)
            y7 = 0.20 * math.cos(angle2)
            x8 = 0.30 * math.sin(angle2)
            y8 = 0.30 * math.cos(angle2)

            self.quad(x5, y5, x6, y6, x7, y7, x8, y8)

            self.extrude(x6, y6, x7, y7)
            self.extrude(x8, y8, x5, y5)

        gl.glEnd()
        gl.glEndList()

        return genList

    def quad(self, x1, y1, x2, y2, x3, y3, x4, y4):
        self.setColor(self.trolltechGreen)

        gl.glVertex3d(x1, y1, -0.05)
        gl.glVertex3d(x2, y2, -0.05)
        gl.glVertex3d(x3, y3, -0.05)
        gl.glVertex3d(x4, y4, -0.05)

        gl.glVertex3d(x4, y4, +0.05)
        gl.glVertex3d(x3, y3, +0.05)
        gl.glVertex3d(x2, y2, +0.05)
        gl.glVertex3d(x1, y1, +0.05)

    def extrude(self, x1, y1, x2, y2):
        self.setColor(self.trolltechGreen.darker(250 + int(100 * x1)))

        gl.glVertex3d(x1, y1, +0.05)
        gl.glVertex3d(x2, y2, +0.05)
        gl.glVertex3d(x2, y2, -0.05)
        gl.glVertex3d(x1, y1, -0.05)

    def normalizeAngle(self, angle):
        while angle < 0:
            angle += 360 * 16
        while angle > 360 * 16:
            angle -= 360 * 16
        return angle

    def setClearColor(self, c):
        gl.glClearColor(c.redF(), c.greenF(), c.blueF(), c.alphaF())

    def setColor(self, c):
        gl.glColor4f(c.redF(), c.greenF(), c.blueF(), c.alphaF())


if __name__ == '__main__':

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())