PyQt OpenGL: Drawing Simple Scenes

I recently painted simple scenes such as triangles and polygons using PyOpenGL. The code was pretty simple, and using different GL_TRIANGLES and GL_POLYGON did not raise any questions.

After that, I decided to add a graphical interface to my application and download pyqt4. So now I am using QtOpenGL and I am stuck. After reading several tutorials, one thing I could do was this . Here is the code: 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_()) 

When trying to use, for example, GL_TRIANGLES, I have this error:

 NameError: global name 'GL_TRIANGLES' is not defined 

Perhaps I did not look around enough, but I did not find any solution.

So my question is how to draw different shapes inside my QGLWidget.

Thank you for your help.

+9
source share
2 answers

Here is a simple working example for Python QGLWidget with a button:

 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_() 
+10
source

I am changing Ivan's answer for Pyqt version 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(QtOpenGL.QGLWidget): def __init__(self, parent=None): super(Ui_MainWindow, self).__init__() self.widget = QtWidgets.QOpenGLWidget(self) 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) viewer = Ui_MainWindow() viewer.show() sys.exit(app.exec_()) 
+2
source

Source: https://habr.com/ru/post/1233977/


All Articles