浅谈PyQt6的OpenGL Widget控件

前言

QOpenGLWidget是用于渲染 OpenGL 图形的小部件,QOpenGLWidget 提供了一个用于绘制OpenGL图形的界面。它是 QOpenGLContext 和 QOpenGLFunctions 的封装,允许开发者利用OpenGL的强大功能进行2D和3D渲染。下面是它的相关控件继承关系:

浅谈PyQt6的OpenGL Widget控件_第1张图片

这个控件我也只是简单的了解了一下,由B站上QOpenGLWidget控件教学大多数是用C++写的,所以我通过科学上网在youtube上跟一个博主学,用python边学边写。由于博主目前也只是略懂,所以教不了太多。

在写代码之前,我们需要安装PyOpenGL:

pip install PyOpenGL PyOpenGL_accelerate

接下来,我就分享QOpenGLWidget的代码

OpenGL1.py:

from PyQt6.QtWidgets import *  
from PyQt6.QtCore import *
from PyQt6.QtGui import *
from OpenGLMain import OpenGLWidget

class MainWindow(QMainWindow): 
    def __init__(self, parent=None):
        super().__init__(parent)  # 使用 super() 初始化
        self.openglwidget = OpenGLWidget(self)
        self.setCentralWidget(self.openglwidget) 
        self.setWindowTitle("OpenGL")
        self.setGeometry(200, 200, 400, 400)

需要注意的是

  • 检查是否有其他文件命名为OpenGL.py,这会导致导入冲突(本人踩坑)

OpenGLMain.py:

from PyQt6.QtWidgets import QApplication
from PyQt6.QtOpenGLWidgets import QOpenGLWidget  
from PyQt6.QtCore import QTimer
from OpenGL.GL import *
from OpenGL.GLU import *

class OpenGLWidget(QOpenGLWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update)
        self.timer.start(16)  

    def initializeGL(self):
        glEnable(GL_DEPTH_TEST)
        glEnable(GL_LIGHT0)
        glEnable(GL_LIGHTING)
        glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)
        glEnable(GL_COLOR_MATERIAL)

    def paintGL(self):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glBegin(GL_TRIANGLES)
        glColor3f(1.0, 0.0, 0.0)  # 红色
        glVertex3f(-0.5, -0.5, 0.0)
        glColor3f(0.0, 1.0, 0.0)  # 绿色
        glVertex3f(0.5, -0.5, 0.0)
        glColor3f(0.0, 0.0, 1.0)  # 蓝色
        glVertex3f(0.0, 0.5, 0.0)
        glEnd()

    def resizeGL(self, w, h):
        glViewport(0, 0, w, h)

if __name__ == "__main__":
    app = QApplication([])
    widget = OpenGLWidget()
    widget.show()
    app.exec()

运行结果

浅谈PyQt6的OpenGL Widget控件_第2张图片

你可能感兴趣的:(windows)