欢迎访问宙启技术站
智能推送

在QOpenGLWidget()中绘制可交互的OpenGL对象

发布时间:2024-01-02 10:05:46

在QOpenGLWidget()中绘制可交互的OpenGL对象,需要以下几个步骤:

1. 导入必要的模块和库:

from PyQt5.QtOpenGL import QGLWidget
from PyQt5.QtCore import pyqtSignal
from OpenGL.GL import *

2. 创建一个继承自QGLWidget的子类,并定义必要的信号:

class MyOpenGLWidget(QGLWidget):
    mouseMoved = pyqtSignal(int, int)

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

3. 重写initializeGL()方法,用于初始化OpenGL环境:

    def initializeGL(self):
        glClearColor(0.0, 0.0, 0.0, 1.0)

4. 重写paintGL()方法,用于绘制OpenGL对象:

    def paintGL(self):
        glClear(GL_COLOR_BUFFER_BIT)

        # 绘制代码...

5. 重写resizeGL()方法,用于处理窗口大小变化事件:

    def resizeGL(self, width, height):
        glViewport(0, 0, width, height)

6. 重写mouseMoveEvent()方法,用于处理鼠标移动事件:

    def mouseMoveEvent(self, event):
        self.mouseMoved.emit(event.x(), event.y())

7. 在主程序中实例化MyOpenGLWidget,并连接信号和槽:

if __name__ == '__main__':
    app = QApplication(sys.argv)

    widget = MyOpenGLWidget()
    widget.mouseMoved.connect(updateMousePosition)

    widget.show()

    sys.exit(app.exec_())

其中,updateMousePosition函数可以根据需要自行定义,用于处理鼠标位置的变化。

下面是一个完整的示例,绘制一个简单的旋转的立方体,并显示鼠标的当前位置:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtOpenGL import QGLWidget
from PyQt5.QtCore import pyqtSignal, QTimer
from OpenGL.GL import *


class MyOpenGLWidget(QGLWidget):
    mouseMoved = pyqtSignal(int, int)

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

        self.rotation = 0.0  # 立方体旋转角度

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.updateGL)

    def initializeGL(self):
        glClearColor(0.0, 0.0, 0.0, 1.0)

    def paintGL(self):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glEnable(GL_DEPTH_TEST)

        glLoadIdentity()
        glTranslatef(0.0, 0.0, -5.0)
        glRotatef(self.rotation, 1.0, 1.0, 1.0)

        glBegin(GL_QUADS)

        glColor3f(1.0, 0.0, 0.0)
        glVertex3f(1.0, 1.0, -1.0)
        glVertex3f(-1.0, 1.0, -1.0)
        glVertex3f(-1.0, -1.0, -1.0)
        glVertex3f(1.0, -1.0, -1.0)

        glColor3f(0.0, 1.0, 0.0)
        glVertex3f(1.0, 1.0, 1.0)
        glVertex3f(-1.0, 1.0, 1.0)
        glVertex3f(-1.0, -1.0, 1.0)
        glVertex3f(1.0, -1.0, 1.0)

        glColor3f(0.0, 0.0, 1.0)
        glVertex3f(1.0, -1.0, -1.0)
        glVertex3f(-1.0, -1.0, -1.0)
        glVertex3f(-1.0, -1.0, 1.0)
        glVertex3f(1.0, -1.0, 1.0)

        glColor3f(1.0, 1.0, 0.0)
        glVertex3f(1.0, 1.0, -1.0)
        glVertex3f(-1.0, 1.0, -1.0)
        glVertex3f(-1.0, 1.0, 1.0)
        glVertex3f(1.0, 1.0, 1.0)

        glColor3f(1.0, 0.0, 1.0)
        glVertex3f(-1.0, 1.0, -1.0)
        glVertex3f(-1.0, 1.0, 1.0)
        glVertex3f(-1.0, -1.0, 1.0)
        glVertex3f(-1.0, -1.0, -1.0)

        glColor3f(0.0, 1.0, 1.0)
        glVertex3f(1.0, 1.0, 1.0)
        glVertex3f(1.0, 1.0, -1.0)
        glVertex3f(1.0, -1.0, -1.0)
        glVertex3f(1.0, -1.0, 1.0)

        glEnd()

        self.rotation += 1.0

    def resizeGL(self, width, height):
        glViewport(0, 0, width, height)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        gluPerspective(45.0, float(width) / float(height), 0.1, 100.0)
        glMatrixMode(GL_MODELVIEW)

    def mouseMoveEvent(self, event):
        self.mouseMoved.emit(event.x(), event.y())

    def startRotation(self):
        self.timer.start(10)


class MyMainWindow(QMainWindow):

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

        self.setWindowTitle("Interactive OpenGL Example")
        self.setFixedSize(800, 600)

        self.glWidget = MyOpenGLWidget(self)
        self.setCentralWidget(self.glWidget)

        self.mousePositionLabel = QLabel(self)
        self.mousePositionLabel.setGeometry(10, 10, 200, 30)
        self.mousePositionLabel.setText("Mouse Position: ")
        self.glWidget.mouseMoved.connect(self.updateMousePosition)

        self.glWidget.startRotation()

    def updateMousePosition(self, x, y):
        self.mousePositionLabel.setText(f"Mouse Position: ({x}, {y})")


if __name__ == '__main__':
    app = QApplication(sys.argv)

    mainWindow = MyMainWindow()
    mainWindow.show()

    sys.exit(app.exec_())

以上示例中,我们绘制了一个简单的旋转的立方体,并显示了鼠标的当前位置。当我们在窗口中移动鼠标时,标签上的内容会更新为当前鼠标的坐标位置。立方体会以一定的速度旋转,直到点击窗口关闭按钮停止旋转。