[PyQt] Help about the use of OpenGL with PyQt

Jamie Riotto jamie.riotto at gmail.com
Sat Apr 4 17:28:08 BST 2009


Christophe,
Your problem is with your OpenGL syntax. Simply change GL.GL_QUADS (which
draw quadrilaterals) with
GL.GL_TRIANGLES (self evident). Also, it would be better to move those
declarations into your triangle routine as follows:

  def triangle(self, x1, y1, z1, x2, y2, z2, x3, y3, z3,r,g,b):
      self.qglColor(QtGui.QColor(r,g,b))
      GL.glBegin(GL.GL_TRIANGLES)
      GL.glVertex3d(x1, y1, z1)
      GL.glVertex3d(x2, y2, z2)
      GL.glVertex3d(x3, y3, z3)
      GL.glEnd()

This way, each glBegin is guaranteed to have a closing glEnd.
I believe it now works as you would expect...
Cheers - jamie
On Sat, Apr 4, 2009 at 9:04 AM, projetmbc <projetmbc at club-internet.fr>wrote:

> Hello,
> I would like to draw for example a 3D triangle with OpenGL. I've tried to
> play with the example Hello GL proposed by PyQt.
>
> In the following code I would like to draw a red triangle and then a blue
> one. I also would like to set the xMin, xMax, yMin, yMax, zMin, zMax, for
> the point of view. My purpose would be to a 3D geometric viewers for
> educational purposes.
>
> Best regards.
> Christophe
>
> ========
> The code
> ========
>
> #!/usr/bin/env python
>
> """PyQt4 port of the opengl/hellogl example from Qt v4.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.",
>                           QtGui.QMessageBox.Ok | QtGui.QMessageBox.Default,
>                           QtGui.QMessageBox.NoButton)
>   sys.exit(1)
>
>
> class Window(QtGui.QWidget):
>   def __init__(self, parent=None):
>       QtGui.QWidget.__init__(self, parent)
>
>       self.glWidget = GLWidget()
>
>       self.xSlider =
> self.createSlider(QtCore.SIGNAL("xRotationChanged(int)"),
>                                        self.glWidget.setXRotation)
>       self.ySlider =
> self.createSlider(QtCore.SIGNAL("yRotationChanged(int)"),
>                                        self.glWidget.setYRotation)
>       self.zSlider =
> self.createSlider(QtCore.SIGNAL("zRotationChanged(int)"),
>                                        self.glWidget.setZRotation)
>
>       mainLayout = QtGui.QHBoxLayout()
>       mainLayout.addWidget(self.glWidget)
>       mainLayout.addWidget(self.xSlider)
>       mainLayout.addWidget(self.ySlider)
>       mainLayout.addWidget(self.zSlider)
>       self.setLayout(mainLayout)
>
>       self.xSlider.setValue(15 * 16)
>       self.ySlider.setValue(345 * 16)
>       self.zSlider.setValue(0 * 16)
>
>       self.setWindowTitle(self.tr("Hello GL"))
>
>   def createSlider(self, changedSignal, setterSlot):
>       slider = QtGui.QSlider(QtCore.Qt.Vertical)
>
>       slider.setRange(0, 360 * 16)
>       slider.setSingleStep(16)
>       slider.setPageStep(15 * 16)
>       slider.setTickInterval(15 * 16)
>       slider.setTickPosition(QtGui.QSlider.TicksRight)
>
>       self.glWidget.connect(slider, QtCore.SIGNAL("valueChanged(int)"),
> setterSlot)
>       self.connect(self.glWidget, changedSignal, slider,
> QtCore.SLOT("setValue(int)"))
>
>       return slider
>
>
> class GLWidget(QtOpenGL.QGLWidget):
>   def __init__(self, parent=None):
>       QtOpenGL.QGLWidget.__init__(self, parent)
>
>       self.object = 0
>       self.xRot = 0
>       self.yRot = 0
>       self.zRot = 0
>
>       self.lastPos = QtCore.QPoint()
>
>       self.trolltechGreen = QtGui.QColor.fromCmykF(0.40, 0.0, 1.0, 0.0)
>       self.trolltechPurple = QtGui.QColor.fromCmykF(0.39, 0.39, 0.0, 0.0)
>
>   def xRotation(self):
>       return self.xRot
>
>   def yRotation(self):
>       return self.yRot
>
>   def zRotation(self):
>       return self.zRot
>
>   def minimumSizeHint(self):
>       return QtCore.QSize(50, 50)
>
>   def sizeHint(self):
>       return QtCore.QSize(400, 400)
>
>   def setXRotation(self, angle):
>       angle = self.normalizeAngle(angle)
>       if angle != self.xRot:
>           self.xRot = angle
>           self.emit(QtCore.SIGNAL("xRotationChanged(int)"), angle)
>           self.updateGL()
>
>   def setYRotation(self, angle):
>       angle = self.normalizeAngle(angle)
>       if angle != self.yRot:
>           self.yRot = angle
>           self.emit(QtCore.SIGNAL("yRotationChanged(int)"), angle)
>           self.updateGL()
>
>   def setZRotation(self, angle):
>       angle = self.normalizeAngle(angle)
>       if angle != self.zRot:
>           self.zRot = angle
>           self.emit(QtCore.SIGNAL("zRotationChanged(int)"), angle)
>           self.updateGL()
>
>   def initializeGL(self):
>       self.qglClearColor(self.trolltechPurple.dark())
>       self.object = self.makeObject()
>       GL.glShadeModel(GL.GL_FLAT)
>       GL.glEnable(GL.GL_DEPTH_TEST)
>       GL.glEnable(GL.GL_CULL_FACE)
>
>   def paintGL(self):
>       GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
>       GL.glLoadIdentity()
>       GL.glTranslated(0.0, 0.0, -10.0)
>       GL.glRotated(self.xRot / 16.0, 1.0, 0.0, 0.0)
>       GL.glRotated(self.yRot / 16.0, 0.0, 1.0, 0.0)
>       GL.glRotated(self.zRot / 16.0, 0.0, 0.0, 1.0)
>       GL.glCallList(self.object)
>
>   def resizeGL(self, width, height):
>       side = min(width, height)
>       GL.glViewport((width - side) / 2, (height - side) / 2, side, side)
>
>       GL.glMatrixMode(GL.GL_PROJECTION)
>       GL.glLoadIdentity()
>       GL.glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0)
>       GL.glMatrixMode(GL.GL_MODELVIEW)
>
>   def mousePressEvent(self, event):
>       self.lastPos = QtCore.QPoint(event.pos())
>
>   def mouseMoveEvent(self, event):
>       dx = event.x() - self.lastPos.x()
>       dy = event.y() - self.lastPos.y()
>
>       if event.buttons() & QtCore.Qt.LeftButton:
>           self.setXRotation(self.xRot + 8 * dy)
>           self.setYRotation(self.yRot + 8 * dx)
>       elif event.buttons() & QtCore.Qt.RightButton:
>           self.setXRotation(self.xRot + 8 * dy)
>           self.setZRotation(self.zRot + 8 * dx)
>
>       self.lastPos = QtCore.QPoint(event.pos())
>
>   def makeObject(self):
>       genList = GL.glGenLists(1)
>       GL.glNewList(genList, GL.GL_COMPILE)
>
>       GL.glBegin(GL.GL_QUADS)
>
>       x1 = +0.06
>       y1 = +0.06
>       z1 = -0.54
>
>       x2 = +0.14
>       y2 = +0.06
>       z2 = -0.54
>
>       x3 = +0.08
>       y3 = +0.00
>       z3 = -0.54
>
>             self.triangle(x1, y1, z1, x2, y2, z2, x3, y3, z3,255,0,0)
>
>
>       GL.glBegin(GL.GL_QUADS)
>             x1 = +0.06
>       y1 = +0.06
>       z1 = 0.54
>             x2 = +0.14
>       y2 = +0.06
>       z2 = 0.54
>             x3 = +0.08
>       y3 = +0.00
>       z3 = 0.54
>             self.triangle(x1, y1, z1, x2, y2, z2, x3, y3, z3,0,0,255)
>             GL.glEnd()
>       GL.glEndList()
>
>       return genList
>
>   def triangle(self, x1, y1, z1, x2, y2, z2, x3, y3, z3,r,g,b):
>       self.qglColor(QtGui.QColor(r,g,b))
>
>       GL.glVertex3d(x1, y1, z1)
>       GL.glVertex3d(x2, y2, z2)
>       GL.glVertex3d(x3, y3, z3)
>
>
>   def extrude(self, x1, y1, x2, y2):
>       self.qglColor(self.trolltechGreen.dark(250 + int(100 * x1)))
>
>       GL.glVertex3d(x1, y1, +0.05)
>       GL.glVertex3d(x2, y2, +0.05)
>       GL.glVertex3d(x2, y2, -0.05)
>       GL.glVertex3d(x1, y1, -0.05)
>
>   def normalizeAngle(self, angle):
>       while angle < 0:
>           angle += 360 * 16
>       while angle > 360 * 16:
>           angle -= 360 * 16
>       return angle
>
>
> if __name__ == '__main__':
>   app = QtGui.QApplication(sys.argv)
>   window = Window()
>   window.show()
>   sys.exit(app.exec_())
>
>
>
> _______________________________________________
> PyQt mailing list    PyQt at riverbankcomputing.com
> http://www.riverbankcomputing.com/mailman/listinfo/pyqt
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20090404/79293aff/attachment.html


More information about the PyQt mailing list