[vtkusers] Rendering VTK inside a QGLWidget

Paul Rossi paulrossi at mail.ru
Wed Oct 12 17:14:31 EDT 2011


Hi Clint,  thank you really a lot, this way things work perfectly!
In fact i had to change a little the flow, because i am using fbo's,
therefore i had to perform the event sending in the display() callback,
and in the mouse handlers i simply recorded the event and set a flag.

so now a snippet of my display callback looks like:

			if (m_bInteractorUpdate) {
				m_bInteractorUpdate = false;

				glPushAttrib(GL_ALL_ATTRIB_BITS);
				fbo.bind();

				m_vtkRenWin->PushState();
				m_vtkRenWin->OpenGLInit();

				m_QVTKIrenAdapter->ProcessEvent(&m_qMouseEvent, m_vtkRenWin->GetInteractor());
				//m_vtkRenWin2->Render();

				m_vtkRenWin->PopState();

				glPopAttrib();
				fbo.release();

				//GetPlugin().update();
			} else {
				fbo.bind();
				glPushAttrib(GL_ALL_ATTRIB_BITS);

				m_vtkRenWin->PushState();
				m_vtkRenWin->OpenGLInit();

				m_vtkRenWin->Render();

				m_vtkRenWin->PopState();

				glPopAttrib();
				fbo.release();
			}			
			
			
And everything works perfectly :)

However, i have yet another question: i embedded the example of the 
TubesWithVaryingRadiusAndColors, and it is great, but when, for instance i tried
to embed the hello world example, i got stuck, as it makes use of a view, instead of a renderwindow.

As far as i can understand, a view is essentially a group of a bit of everything
(render, renderwindow, interactor, actors, etc etc).
What i did was something like this (without success):

	void initVtk3() {
		vtkRandomGraphSource* source = vtkRandomGraphSource::New();

		vtkGraphLayoutView* view = vtkGraphLayoutView::New();
		view->SetRepresentationFromInputConnection(
			source->GetOutputPort());

		//view->ResetCamera();

		m_vtkRenWin = vtkGenericOpenGLRenderWindow::New();
		m_vtkRenWin->SetSize(m_uWidth, m_uHeight);

		m_vtkIren = QVTKInteractor::New();
		m_vtkIren->SetRenderWindow(m_vtkRenWin);
		m_vtkIren->Initialize();
		m_vtkIren->SetInteractorStyle(view->GetInteractorStyle());
		m_vtkRenWin->AddRenderer(view->GetRenderer());
		view->SetInteractor(m_vtkIren);
		view->SetRenderWindow(m_vtkRenWin);


		m_vtkRenWin->SwapBuffersOff();
		//source->Delete();
	}
	
is there something particular i should do in order to get views to work with QVTK_QTOPENGL?
thanks,
Paul



11 октября 2011, 18:14 от Clinton Stimpson <clinton at elemtech.com>:
> On Tuesday, October 11, 2011 07:58:30 am Paul Rossi wrote:
> > Hi Clint,
> > so in fact the status seems to be complete, and in general
> > bindFramebufferEXT() called with 0 should never return invalid operation.
> > But oh well.. it seems to work, and so i dont care too much about it.
> >
> > Rather the interaction: i followed your suggestion, but unfortunately there
> > is not much documentation about QVTKInteractorAdapter. i found only this
> > page:
> >
> > https://www.kitware.com/InfovisWiki/index.php/IP2/qgraphicsview-events
> >
> > and i created the sample code below, that unfortunately crashes when i try
> > to interact. I am not sure what i am doing wrong here, perhaps you have an
> > idea?
> 
> Have you tried using the debugger?  Maybe you need a debug build of VTK to get
> useful information.  Some suggestions below in the code...
> 
> > by the way, is the page
> > http://qt.nokia.com/products/3rdparty/vtksupport.html still available
> > somewhere else?
> 
> I don't know.
> 
> > best,
> > Paul
> >
> > //CLASS STARTS
> >
> >
> > #ifndef GLWIDGETCUBE_H
> > #define GLWIDGETCUBE_H
> >
> >
> > #include <QtGui>
> > #include <QtOpenGL>
> > #include <QGLWidget>
> >
> > #include <math.h>
> > #include <stdlib.h>
> > #include <stdio.h>
> > #include "vtkRenderWindowInteractor.h"
> > #include "vtkRenderWindow.h"
> > #include "vtkRenderer.h"
> > #include "vtkGenericOpenGLRenderWindow.h"
> > #include "vtkSphereSource.h"
> > #include "vtkCubeSource.h"
> > #include "vtkPolyDataMapper.h"
> > #include "vtkActor.h"
> > #include "vtkPolyDataNormals.h"
> > #include "QVTKInteractorAdapter.h"
> > #include "QPoint"
> > #include "QPointF"
> > #include "QMouseEvent"
> > #include "QFrame"
> > #include "QGLWidget"
> > #include "QListWidget"
> >
> > class GLWidgetCube : public QGLWidget
> > {
> > 	Q_OBJECT
> >
> >
> >
> >
> > public:
> > 	GLWidgetCube(QWidget *parent=0) : QGLWidget(parent)
> > 	{
> >
> > 	};
> > 	~GLWidgetCube()
> > 	{
> > 	};
> >
> >
> > signals:
> > 		void sliceNumberChanged(int slices);
> >
> > protected:
> > 	void initializeGL() {
> > 		glClearColor(0, 0, 0, 1);
> > 		glEnable(GL_DEPTH_TEST);
> > 		initVtk();
> > 	}
> >
> > 	void initVtk() {
> > 		m_vtkRenWin = vtkGenericOpenGLRenderWindow::New();
> > 		m_vtkRen = vtkRenderer::New();
> > 		vtkRenderWindowInteractor *m_vtkIren =
> vtkRenderWindowInteractor::New();
> 
> If you want timer events to work, this should be a QVTKInteractor, not one
> created by vtkRenderWindowInteractor::New();
> 
> >
> > 		m_QVTKIrenAdapter = new QVTKInteractorAdapter(this);
> >
> > 		if (!m_QVTKIrenAdapter)
> > 			printf("Adapter null\n");
> > 		m_vtkIren->SetRenderWindow(m_vtkRenWin);
> > 		m_vtkRenWin->AddRenderer(m_vtkRen);
> > 		m_vtkSphereSource = vtkSphereSource::New();
> > 		m_vtkSphereSource->SetRadius(1);
> > 		m_vtkSphereSource->SetThetaResolution(8);
> > 		m_vtkSphereSource->SetPhiResolution(8);
> > 		m_vtkSphereMapper = vtkPolyDataMapper::New();
> > 		m_vtkSphereMapper->SetInput(m_vtkSphereSource->GetOutput());
> > 		m_vtkSphereActor = vtkActor::New();
> > 		m_vtkSphereActor->SetMapper(m_vtkSphereMapper);
> > 		m_vtkRen->AddActor(m_vtkSphereActor);
> > 		m_vtkRenWin->SwapBuffersOff();
> > 	}
> >
> > 	void paintGL() {
> > 		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
> > 		glMatrixMode(GL_MODELVIEW);
> > 		glLoadIdentity();
> >
> > 		drawVtk();
> > 	}
> >
> > 	void drawVtk() {
> > 		m_vtkRenWin->PushState();
> > 		m_vtkRenWin->OpenGLInit();
> > 		m_vtkRenWin->Render();
> > 		m_vtkRenWin->PopState();
> > 	}
> >
> > 	void resizeGL(int width, int height) {
> > 		m_uWidth = width;
> > 		m_uHeight =  height;
> > 		m_vtkRenWin->SetSize(m_uWidth,m_uHeight);
> > 		updateGL();
> > 	}
> >
> 
> For resize event, have a look at QVTKWidget2::resizeGL().  No need for
> updateGL() is there?
> 
> > /* Handlers */
> >
> > 	void mousePressEvent(QMouseEvent *event)
> > 	{
> > 		QPointF pf = event->pos();
> > 		QPoint pi = pf.toPoint();
> >
> > 		event->accept();
> > 		QMouseEvent e2(QEvent::MouseButtonPress, pi, event->button(),
> > 			event->buttons(), event->modifiers());
> > 		m_QVTKIrenAdapter->ProcessEvent(&e2, m_vtkIren);
> > 		updateGL();
> > 	}
> 
> I suggest looking at QVTKWidget2::mousePressEvent() for an example.  Ditto for
> other handlers in your example.
> 
> Hope that helps.
> 
> --
> Clinton Stimpson
> Elemental Technologies, Inc
> Computational Simulation Software, LLC
> www.csimsoft.com
> _______________________________________________
> Powered by www.kitware.com
> 
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
> 
> Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
> 
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
> 


More information about the vtkusers mailing list