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