【问题标题】:PyQt OpenGL: drawing simple scenesPyQt OpenGL:绘制简单场景
【发布时间】:2016-01-17 00:44:26
【问题描述】:

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

之后我决定将 GUI 添加到我的应用程序并下载 pyqt4。 所以现在我从那里使用 QtOpenGL,我被卡住了。 在阅读了几个教程之后,我可以执行的一件事是this。这是代码:x

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 中绘制不同的图形。

感谢您的帮助。

【问题讨论】:

    标签: python qt opengl pyqt pyqt4


    【解决方案1】:

    这是一个带有按钮的 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_()
    

    【讨论】:

    • 非常感谢,鲸先生!
    • 这会立即关闭。通过在底部的 main 条件中添加 sys.exit(app.exec_()) 来修复它
    【解决方案2】:

    我修改了 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,我猜是颜色选择、窗口大小或放大太多。你用给定的值试过我的 sn-p 吗?
    • 我运行你的 sn-p 完全如图所示......它运行没有错误,但 opengl 小部件只显示黑色。我正在运行 PyQt5 和 Python 3.7
    • @panofish 您介意用您的代码提出新问题吗?如果您添加更多详细信息,我或其他人可以通过重现您的错误来找到原因。
    • 感谢您的建议。代码与您在此处显示的完全相同。没有变化。仅使用 Python 3.7。
    猜你喜欢
    • 2014-06-23
    • 1970-01-01
    • 2011-12-27
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多