[vtkusers] GLXBadDrawable on application exit
Félix C. Morency
felix.morency at gmail.com
Tue Jul 3 16:38:53 EDT 2012
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
--
--
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
More information about the vtkusers
mailing list