import sys
from vtk import vtkRenderer, vtkRenderWindow, vtkGenericOpenGLRenderWindow, \
                vtkImplicitPlaneWidget2, vtkImplicitPlaneRepresentation, \
                QVTKWidget, QVTKWidget2
                
from PyQt4.QtGui import *

class QVTKOpenGLWidget(QVTKWidget2):   
    def __init__(self, parent = None):
        QVTKWidget2.__init__(self, parent)

        self.renderer = vtkRenderer()
        self.renderWindow = vtkGenericOpenGLRenderWindow()
        self.renderWindow.AddRenderer(self.renderer)
        self.SetRenderWindow(self.renderWindow)
        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

    def resizeEvent(self, event):
        #ordering is important here
        #1.) Let the QVTKWidget2 resize itself
        QVTKWidget2.resizeEvent(self,event)
        
        #2.) Make sure the interactor is assigned a correct new size
        #    This works around a bug in VTK.
        w,h = self.width(), self.height()
        self.w = w
        self.h = h
        print self.width(), self.height()
        self.renderWindow.GetInteractor().SetSize(w,h)
        
        self.update()
        
    def update(self):
        #for some reason the size of the interactor is reset all the time
        #fix this
        print self.width(), self.height()
        self.renderWindow.GetInteractor().SetSize(self.width(), self.height())
        QVTKWidget2.update(self)
        
        self.paintGL()

app = QApplication(sys.argv)

qvtk = None; win2 = None
ren = vtkRenderer()
if sys.argv[1] == "1":
    print "Using QVKTWidget"
    qvtk = QVTKWidget()
    win2 = vtkRenderWindow()
    qvtk.SetRenderWindow(win2)
    qvtk.show()
    win2.AddRenderer(ren)
elif sys.argv[1] == "2":
    print "Using QVKTWidget2"
    qvtk = QVTKWidget2()
    win2 = vtkGenericOpenGLRenderWindow()
    qvtk.show()
    qvtk.SetRenderWindow(win2)
    win2.AddRenderer(ren)
    #important: the window first needs to be shown so that the
    #correct size can be set for the interactor, see QVTKWidget2.cxx:173
elif sys.argv[1] == "3":
    print "Using QVTKOpenGLWidget"
    qvtk = QVTKOpenGLWidget()
    qvtk.show()
    #important: the window first needs to be shown so that the
    #correct size can be set for the interactor, see QVTKWidget2.cxx:173

p = vtkImplicitPlaneRepresentation()
p.SetPlaceFactor(1.0)
p.SetOrigin(0.25,0.25,0.25)
p.PlaceWidget([0,1,0,2,0,3])
p.SetNormal(1,0,0)
p.OutlineTranslationOff()

pw = vtkImplicitPlaneWidget2()
pw.SetRepresentation(p)

pw.SetInteractor(qvtk.GetInteractor())
pw.On()

ren.ResetCamera()

m = QMainWindow()
l = QVBoxLayout()
l.addWidget(qvtk)
l.addWidget(QPushButton('test'))
w = QWidget()
w.setLayout(l)
m.setCentralWidget(w)
m.show()
app.exec_()

