[vtkusers] GLXBadDrawable on application exit
Clinton Stimpson
clinton at elemtech.com
Tue Jul 3 18:26:48 EDT 2012
Here's another idea... could QVTKRenderWindowInteractor create a hidden child
widget, connect to its destroyed() signal and call vtkRenderWindow::Finalize()
then? Would that work for all embedded vs. non-embedded cases?
Using its own destroyed() signal is too late, but child widgets are destroyed
before any cleanup of itself starts.
Alternatively, you can use the C++ QVTKWidget wrapped for Python. Its
destructor does this kind of cleanup.
Clint
On Tuesday, July 03, 2012 04:38:53 PM Félix C. Morency wrote:
> Adding the closeEvent handler works for non-embedded
> QVTKRenderWindowInteractor. I think we should push this. Do you want
> me to prepare a patch?
>
> I found three ways of solving the issue of embedded interactors:
>
> 1) Subclass QMdiSubWindow, render on a QFrame and call close() on the
> VTK interactor from the QMdiSubWindow closeEvent [1]
> 2) Subclass the rendering surface (QFrame) and call close() on the VTK
> interactor from the QFrame closeEvent [2]
> 3) Install a custom event filter (QObject.installEventFilter) on the
> rendering surface (QFrame) and call close() from the eventFilter
> method [3]
>
> I don't like 1) because the content of the created subwindow is
> limited by the subclass. I don't like 2) because a subclassing would
> be needed for each desired rendering surface... although I don't know
> if anything else than a QFrame is usable. I like 3) because the event
> filter can be installed on any QObject and shaped as desired.
>
> [1]: https://gist.github.com/3042843
> [2]: https://gist.github.com/3042849
> [3]: https://gist.github.com/3042862
>
> Feel free to comment if I am missing some details. Do you think we
> should create a proper filter and add it to VTK? Or simple heavily
> document this case somewhere?
>
> -F
>
> On Mon, Jul 2, 2012 at 4:07 PM, Clinton Stimpson <clinton at elemtech.com>
wrote:
> > I don't see a way to have Qt tell you when its going to destroy the
> > window. Perhaps you can add a
> > def closeEvent(self, ev):
> > self._RenderWindow.Finalize()
> >
> > That might be harmless even if one wants to show the window again.
> >
> > Clint
> >
> > On Wednesday, June 27, 2012 01:45:33 PM Félix C. Morency wrote:
> >> Clinton,
> >>
> >> Thank you for your answer. Destructors in Python are a bit tricky and
> >> I'm not too familiar with it. If I understand correctly, the __del__()
> >> method will be called if the reference count to the current object is
> >> zero. However, it seems that the reference count of the
> >> QVTKRenderWindowInteractor will never be zero because of self
> >> reference given by the lines:
> >>
> >> self._Iren.AddObserver('CreateTimerEvent', self.CreateTimer)
> >> self._Iren.AddObserver('DestroyTimerEvent', self.DestroyTimer)
> >> self._Iren.GetRenderWindow().AddObserver('CursorChangedEvent',
> >> self.CursorChangedEvent)
> >>
> >> If I comment those lines anyway, the following destructor is called:
> >>
> >> def __del__(self):
> >> self._RenderWindow.Finalize()
> >>
> >> However, I still have the GLXBadDrawable errors when creating multiple
> >> embedded VTK window.
> >>
> >> Also, if I had
> >>
> >> vtk_interactor1.Initialize()
> >> vtk_interactor2.Initialize()
> >>
> >> after the lines
> >>
> >> vtk_interactor1 = QVTKRenderWindowInteractor(parent=qframe1)
> >> vtk_interactor2 = QVTKRenderWindowInteractor(parent=qframe2)
> >>
> >> of the code snippet of my previous message, the application segfault.
> >> However, if I start that same application with the '-sync' parameter
> >> you mentioned in the other email thread, it works. You can find
> >> another example in [1] that works with and without the '-sync'
> >> parameter. This time, the two Initialize() calls don't crash the
> >> application. The main difference is that the windows are not embedded
> >> in a MdiArea. However, I still have GLXBadDrawable, even with the
> >> added destructor in QVTKRenderWindow.
> >>
> >> [1]: https://gist.github.com/3005627
> >>
> >> Regards,
> >> -F
> >>
> >> On Fri, Jun 22, 2012 at 6:42 PM, Clinton Stimpson
> >> <clinton at elemtech.com>
> >
> > wrote:
> >> > QVTKRenderWindowInteractor needs a destructor that calls
> >> > Finalize() on
> >> > the vtkRenderWindow.
> >> > Otherwise, vtkXOpenGLRenderWindow::Finalize() will be called after
> >> > the
> >> > QWidget is gone, leading to X errors with an invalid Window.
> >> >
> >> > Clint
> >> >
> >> > On Thursday, June 21, 2012 02:11:36 PM Félix C. Morency wrote:
> >> >> Hi,
> >> >>
> >> >> I posted this issue in another thread on the developers mailing
> >> >> list
> >> >> but felt I should post it here. I encounter GLXBadDrawable
> >> >> errors when I exit an application rendering multiple
> >> >> QVTKRenderWindowInteractor in a QMdiArea. The GLXBadDrawable
> >> >> looks like
> >> >>
> >> >> X Error of failed request: GLXBadDrawable
> >> >> Major opcode of failed request: 135 (GLX)
> >> >> Minor opcode of failed request: 5 (X_GLXMakeCurrent)
> >> >> Serial number of failed request: 95
> >> >> Current serial number in output stream: 95
> >> >>
> >> >> You can find in [1] a code snippet that reproduces the issue. It
> >> >> happens on Linux as well as on Windows. It has been tested with
> >> >> PySide v1.1.1, PyQt4 v4.9.1 and VTK 5.10.0.
> >> >>
> >> >> Does anyone have a clue why this is happening?
> >> >>
> >> >> [1]: https://gist.github.com/2967336
> >> >>
> >> >> Regards,
> >> >> --
> >> >> Félix C. Morency, M.Sc.
> >> >> Plateforme d’analyse et de visualisation d’images
> >> >> Centre Hospitalier Universitaire de Sherbrooke
> >> >> Centre de recherche clinique Étienne-Le Bel
> >> >> Local Z5-3031 | 819.346.1110 ext 16634
> >> >> _______________________________________________
> >> >> 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
> >> >
> >> > --
> >> > Clinton Stimpson
> >> > Elemental Technologies, Inc
> >> > Computational Simulation Software, LLC
> >> > www.csimsoft.com
> >
> > --
> > 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
--
Clinton Stimpson
Elemental Technologies, Inc
Computational Simulation Software, LLC
www.csimsoft.com
More information about the vtkusers
mailing list