« Return to Thread: Qt4 backend: critical bug with PyQt4 v4.6+

Re: Qt4 backend: critical bug with PyQt4 v4.6+

by Darren Dale :: Rate this Message:

| View in Thread

Hi Pierre,

Thanks for the report. I'll have a look as soon as I get a chance.

Darren

On Wed, Nov 4, 2009 at 5:29 PM, Pierre Raybaut <contact@...> wrote:

> A simpler fix would be:
>
>        class FigureWindow(QtGui.QMainWindow):
>            def __init__(self):
>                super(FigureWindow, self).__init__()
>
>            def closeEvent(self, event):
>                super(FigureWindow, self).closeEvent(event)
>                self.emit(QtCore.SIGNAL('destroyed()'))
>
> and replacing QtGui.QMainWindow by FigureWindow in FigureManagerQT.
>
> Pierre
>
> Pierre Raybaut a écrit :
>> Hi,
>>
>> Some Spyder users have reported a critical bug occuring with
>> matplotlib 0.99's Qt4 backend and PyQt4 v4.6 (e.g. in Ubuntu Karmic).
>>
>>
>> Here is the traceback after calling 'plot([])', closing figure and
>> calling again 'plot([])' (e.g. in an IPython session with options
>> --pylab and --q4thread):
>>
>> Traceback (most recent call last):
>>  File "/home/rick/Temp/untitled0.py", line 9, in <module>
>>    show()
>>  File "/usr/lib/pymodules/python2.6/matplotlib/backends/backend_qt4.py",
>> line 63, in show
>>    manager.window.show()
>> RuntimeError: underlying C/C++ object has been deleted
>>
>>
>> I found out that the 'destroyed()' signal (connected in class
>> FigureManagerQT) is never emitted when figure is closed.
>> As a consequence, SIP is not very happy when trying to draw a deleted
>> object...
>>
>> I made the following changes to make it work:
>>
>> # New class to clarify code in FigureManagerQT
>> class FigureWindow(QtGui.QMainWindow):
>>    def __init__(self, num, canvas, close_callback):
>>        super(FigureWindow, self).__init__()
>>        self.close_callback = close_callback
>>        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
>>        self.setWindowTitle("Figure %d" % num)
>>        image = os.path.join(matplotlib.rcParams['datapath'],
>>                             'images', 'matplotlib.png')
>>        self.setWindowIcon(QtGui.QIcon(image))
>>        self._destroying = False
>>        self.setCentralWidget(canvas)
>>        if matplotlib.is_interactive():
>>            self.show()
>>           def closeEvent(self, event):
>>        super(FigureWindow, self).closeEvent(event)
>>        self.close_callback()
>>
>> class FigureManagerQT( FigureManagerBase ):
>>    """
>>    Public attributes
>>
>>    canvas      : The FigureCanvas instance
>>    num         : The Figure number
>>    toolbar     : The qt.QToolBar
>>    window      : The qt.QMainWindow
>>    """
>>
>>    def __init__( self, canvas, num ):
>>        if DEBUG: print 'FigureManagerQT.%s' % fn_name()
>>        FigureManagerBase.__init__( self, canvas, num )
>>        self.canvas = canvas
>>
>>        # Give the keyboard focus to the figure instead of the manager
>>        self.canvas.setFocusPolicy( QtCore.Qt.ClickFocus )
>>        self.canvas.setFocus()
>>
>>        self.window = FigureWindow(num, self.canvas, self._widgetclosed)
>>        self.toolbar = self._get_toolbar(self.canvas, self.window)
>>        self.window.addToolBar(self.toolbar)
>>        QtCore.QObject.connect(self.toolbar, QtCore.SIGNAL("message"),
>>                               self.window.statusBar().showMessage)
>> # [...]
>>
>> And we may now remove the "QtCore.QObject.disconnect" for the no
>> longer existing signal 'destroyed()' in method 'FigureManagerQT.
>> destroy'.
>>
>> HTH
>>
>> Cheers,
>> Pierre
>>
>>
>
>
> ------------------------------------------------------------------------------
> Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
> trial. Simplify your report design, integration and deployment - and focus on
> what you do best, core application coding. Discover what's new with
> Crystal Reports now.  http://p.sf.net/sfu/bobj-july
> _______________________________________________
> Matplotlib-devel mailing list
> Matplotlib-devel@...
> https://lists.sourceforge.net/lists/listinfo/matplotlib-devel
>

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@...
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

 « Return to Thread: Qt4 backend: critical bug with PyQt4 v4.6+