PyQt OpenGL: 绘制简单场景

10

最近,我使用PyOpenGL绘制了简单的三角形和多边形场景。代码非常简单,使用不同的GL_TRIANGLES和GL_POLYGON也没有引起任何问题。

之后,我决定给我的应用程序添加GUI,并下载了pyqt4。现在我正在使用那里的QtOpenGL,但是我卡住了。经过阅读几篇教程,我能做的唯一一件事情就是这个。下面是代码:

import sys
import math

from PyQt4 import QtCore, QtGui, QtOpenGL

try:
    from OpenGL import GL
except ImportError:
    app = QtGui.QApplication(sys.argv)
    QtGui.QMessageBox.critical(None, "OpenGL hellogl",
            "PyOpenGL must be installed to run this example.")
    sys.exit(1)


class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()

        self.glWidget = GLWidget()
        self.button = self.createButton()

        mainLayout = QtGui.QHBoxLayout()
        mainLayout.addWidget(self.glWidget)
        mainLayout.addWidget(self.button)

        self.setLayout(mainLayout)

        self.setWindowTitle("Hello GL")
    def createButton(self):
        button = QtGui.QPushButton("&WOOF")
        button.clicked.connect(self.close)
        return button



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

        self.trolltechPurple = QtGui.QColor.fromCmykF(0.39, 0.39, 0.0, 0.0)

    def minimumSizeHint(self):
        return QtCore.QSize(100, 300)

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


    def initializeGL(self):
        self.qglClearColor(self.trolltechPurple.dark())

    def paintGL(self):
        GL.glMatrixMode(GL.GL_MODELVIEW)
        GL.glLoadIdentity()
        GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
        GL.glColor3f(1,0,0)
        GL.glRectf(-1,-1,1,0)
        GL.glColor3f(0,1,0)
        GL.glRectf(-1,0,1,1)
        GL.glBegin(GL_TRIANGLES)
        glVertex2f(3.0, 3.0)
        glVertex2f(5.0, 3.0)
        glVertex2f(5.0, 5.0)
        glVertex2f(6.0, 4.0)
        glVertex2f(7.0, 4.0)
        glVertex2f(7.0, 7.0)
        glEnd()
        GL.glFinish()



if __name__ == '__main__':

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

尝试使用例如GL_TRIANGLES时,我遇到了这个错误:

NameError: global name 'GL_TRIANGLES' is not defined

也许我还没有找到足够的解决方案,但我没有找到任何解决办法。

所以我的问题是如何在我的 QGLWidget 内绘制不同的图形。

感谢您的帮助。

2个回答

11

这是一个简单的Python QGLWidget和按钮的工作示例:

from OpenGL.GL import *
from OpenGL.GLU import *
from PyQt4 import QtGui
from PyQt4.QtOpenGL import *

class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.widget = glWidget(self)
        self.button = QtGui.QPushButton('Test', self)
        mainLayout = QtGui.QHBoxLayout()
        mainLayout.addWidget(self.widget)
        mainLayout.addWidget(self.button)
        self.setLayout(mainLayout)

class glWidget(QGLWidget):

    def __init__(self, parent):
        QGLWidget.__init__(self, parent)
        self.setMinimumSize(640, 480)

    def paintGL(self):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glLoadIdentity()
        glTranslatef(-2.5, 0.5, -6.0)
        glColor3f( 1.0, 1.5, 0.0 )
        glPolygonMode(GL_FRONT, GL_FILL)
        glBegin(GL_TRIANGLES)
        glVertex3f(2.0,-1.2,0.0)
        glVertex3f(2.6,0.0,0.0)
        glVertex3f(2.9,-1.2,0.0)
        glEnd()
        glFlush()

    def initializeGL(self):
        glClearDepth(1.0)              
        glDepthFunc(GL_LESS)
        glEnable(GL_DEPTH_TEST)
        glShadeModel(GL_SMOOTH)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()                    
        gluPerspective(45.0,1.33,0.1, 100.0) 
        glMatrixMode(GL_MODELVIEW)

if __name__ == '__main__':
    app = QtGui.QApplication(['Yo'])
    window = MainWindow()
    window.show()
    app.exec_()

非常感谢您,鲸先生! - a-a
这个立即关闭。通过在底部的__main__条件中添加sys.exit(app.exec_())来修复它。 - Mafster

8

我修改了Ivan对PyQt版本5的答案。

import sys
from OpenGL.GL import *
from OpenGL.GLU import *
from PyQt5 import QtGui
from PyQt5.QtOpenGL import *
from PyQt5 import QtCore, QtWidgets, QtOpenGL


class Ui_MainWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Ui_MainWindow, self).__init__()
        self.widget = glWidget()
        self.button = QtWidgets.QPushButton('Test', self)
        mainLayout = QtWidgets.QHBoxLayout()
        mainLayout.addWidget(self.widget)
        mainLayout.addWidget(self.button)
        self.setLayout(mainLayout)


class glWidget(QGLWidget):
    def __init__(self, parent=None):
        QGLWidget.__init__(self, parent)
        self.setMinimumSize(640, 480)

    def paintGL(self):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glLoadIdentity()
        glTranslatef(-2.5, 0.5, -6.0)
        glColor3f( 1.0, 1.5, 0.0 );
        glPolygonMode(GL_FRONT, GL_FILL);
        glBegin(GL_TRIANGLES)
        glVertex3f(2.0,-1.2,0.0)
        glVertex3f(2.6,0.0,0.0)
        glVertex3f(2.9,-1.2,0.0)
        glEnd()
        glFlush()

    def initializeGL(self):
        glClearDepth(1.0)              
        glDepthFunc(GL_LESS)
        glEnable(GL_DEPTH_TEST)
        glShadeModel(GL_SMOOTH)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()                    
        gluPerspective(45.0,1.33,0.1, 100.0) 
        glMatrixMode(GL_MODELVIEW)


if __name__ == '__main__':    
    app = QtWidgets.QApplication(sys.argv)    
    Form = QtWidgets.QMainWindow()
    ui = Ui_MainWindow(Form)    
    ui.show()    
    sys.exit(app.exec_())

为什么我的OpenGL视图只显示黑色,我什么都看不到? - panofish
@panofish,我猜测可能是颜色选择、窗口大小或者缩放过多。你尝试使用给定的数值来测试我的代码片段了吗? - Cloud Cho
我按照您的代码片段运行了一遍,没有出现错误,但OpenGL小部件只显示黑色。我正在使用PyQt5和Python 3.7。 - panofish
@panofish,您介意用您的代码开一个新问题吗?如果您添加更多细节,我或其他人可以通过重现您的错误来找到原因。 - Cloud Cho
感谢您的建议。代码与您在此处展示的完全相同,没有任何更改。只是使用Python 3.7。 - panofish
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接