【问题标题】:PyQT5 OpenGL zoomPyQT5 OpenGL 缩放
【发布时间】:2018-11-22 10:55:53
【问题描述】:

所以我想在 PyQT 中做一个缩放功能。从答案8.040 我实现它是这样的:

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

        self.object = 0
        self.zoomFactor = 1.0

        self.setFocusPolicy(Qt.WheelFocus)
        self.lastPos = QPoint()

def resizeGL(self, width, height):
        gl.glViewport(0, 0, width, height)
        gl.glMatrixMode(gl.GL_PROJECTION)
        gl.glLoadIdentity()
        gl.glOrtho(-2 * self.zoomFactor, +2 * self.zoomFactor, +2 * self.zoomFactor, -2 * self.zoomFactor, 4.0, 15.0)
        gl.glMatrixMode(gl.GL_MODELVIEW)

现在在程序开始时,如果我将 self.zoomFactor 更改为 2.0,它具有所需的缩放效果,但我似乎无法在运行时调整它的大小。

def wheelEvent(self, event):
    """http://doc.qt.io/qt-5/qwheelevent.html"""
    scroll = event.angleDelta()
    if scroll.y() > 0:  # up
        self.zoomFactor += 0.1
        self.resizeGL(self.width(), self.height())
        self.update()
        pass
    else:  # down
        pass

上面的代码是我已经尝试过的,没有达到预期的效果。它捕捉到向上的缩放并调用resizeGL 函数,但不会放大/缩小。

【问题讨论】:

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


    【解决方案1】:

    得到了答案。它确实有效。 resizeGL 仅在调整窗口大小时更新,因此我们必须在另一种方法中使用它。

    【讨论】:

    • 我现在用的方法是paintGL
    【解决方案2】:

    也许它会帮助别人:

    def paintGL(self, coordinates=None):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    
        glPushMatrix()
    
        glTranslate(0.0, 0.0, -50.0)
        glScale(0.1 * self.zoomFactor, 0.1 * self.zoomFactor, 0.1 * self.zoomFactor)
        glRotate(self.rotX, 1.0, 0.0, 0.0)
        glRotate(self.rotY, 0.0, 1.0, 0.0)
        glRotate(self.rotZ, 0.0, 0.0, 1.0)
        glTranslate(-0.5, -0.5, -0.5)
    
        glEnableClientState(GL_VERTEX_ARRAY)
    
        glVertexPointer(3, GL_FLOAT, 0, self.vertVBO)
    
        glDrawElements(GL_QUADS, len(self.edges), GL_UNSIGNED_INT, self.edges)
    
        glDisableClientState(GL_VERTEX_ARRAY)
    
        glPopMatrix()
    
    def wheelEvent(self, event):
        scroll = event.angleDelta()
        if scroll.y() > 0:
            self.zoomFactor += 0.1
            self.update()
        else:
            self.zoomFactor -= 0.1
            self.update()
    
    def initializeGL(self):
        glClearColor(0.0, 0.0, 0.0, 0.0)
        glEnable(GL_DEPTH_TEST)
    
        self.initGeometry()
    
        self.rotX = 0.0
        self.rotY = 0.0
        self.rotZ = 0.0
    
        self.zoomFactor = 1.0
    

    要放大/缩小你必须在渲染形状之前调用 glScale() 函数而不是 resizeGL()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-28
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2023-04-02
      • 2016-06-19
      相关资源
      最近更新 更多