PyQt4でOpenGL

とりあえず、簡単なサンプルを作成した。

# coding: cp932
import sys
from PyQt4 import QtCore, QtGui, QtOpenGL
from OpenGL import GL, GLU, GLUT

r = 0.0
light_ambient = [1.0, 1.0, 1.0, 1.0]    # 環境光(白色)
light_diffuse = [1.0, 1.0, 1.0, 1.0]    # 拡散光(白色)
light_specular = [1.0, 1.0, 1.0, 1.0]   # 鏡面光(白色)
light_position = [2.0, 2.0, 1.0, 1.0]   # 照明の位置

class GLWidget(QtOpenGL.QGLWidget):
    def __init__(self, parent=None):
        QtOpenGL.QGLWidget.__init__(self, QtOpenGL.QGLFormat(QtOpenGL.QGL.SampleBuffers), parent)
        
    def initializeGL(self):
        self.qglClearColor(QtGui.QColor.fromCmykF(0.39, 0.39, 0.0, 0.0))
        GL.glClearDepth(1.0)
        #GL.glShadeModel(GL.GL_FLAT)
        GL.glShadeModel(GL.GL_SMOOTH)
        GL.glDepthFunc(GL.GL_LESS)
        GL.glEnable(GL.GL_DEPTH_TEST)
        GL.glEnable(GL.GL_CULL_FACE)
        
        GL.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, light_ambient)
        GL.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, light_diffuse)
        GL.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, light_specular)
        GL.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, light_position)
        GL.glEnable(GL.GL_LIGHTING)  # ライティングを有効にする
        GL.glEnable(GL.GL_LIGHT0)    # 0番目の照明を有効にする
        
        timer = QtCore.QTimer(self)
        self.connect(timer, QtCore.SIGNAL("timeout()"), self, QtCore.SLOT("updateGL()"))
        timer.start(16)
        
    def paintGL(self):
        global r
        GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
        
        GL.glPushMatrix()
        GL.glRotated(r, 0.0, 1.0, 0.0)
        GLUT.glutSolidTorus(0.3, 0.5, 30, 30)
        GL.glPopMatrix()
        r += 1.0
        if r > 360.0: r = 0.0
    
    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(-1.0, 1.0, -1.0, 1.0, -10.0, 10.0)
        GL.glMatrixMode(GL.GL_MODELVIEW)

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        widget = GLWidget(self)
        self.setCentralWidget(widget)
        self.setWindowTitle(self.tr("Qt GL"))
        self.resize(400, 300)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())