Re: [PyQt] memory leak using QMainWindow.removeToolBar
On Mon, 16 Aug 2010 22:59:22 + (UTC), danny shev...@lanl.gov wrote: thanks, your solution works, and stops my code from seg faulting. I'm curious why mine doesn't work. In the documentation for QMainWindow http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qmainwindow.html#addToolBar-3 The third overloading of the addToolBar method, was what I was using. It should be equivalent, but I must be missing something. There does seem to be a bug. Even though addToolBar() takes ownership of the toolbar, removeToolBar() doesn't change the current ownership. It will be fixed in tonight's snapshot. The consequence is that you have to do extra work to really delete a removed toolbar, ie. reparent it to None. Phil ___ PyQt mailing listPyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt
[PyQt] memory leak using QMainWindow.removeToolBar
Howdy, I have run into this curious problem that I think is caused by a memory leak or improper reference counting related to toolbars in QMainWindow.removeToolBar. The problem appears when you remove a toolbar but keep an instance variable maintaining a reference to the toolbar. I am aware that removeToolBar only hides the toolbar and does not delete it. I also am aware that the following code may seem foolish, but it does show the bug. The code below is a minimal example demonstrating the problem. It is 34 lines long. Simply run the app, and close via the close box. The app will not close gracefully, but rather seg fault. This has been validated on windows and Linux. I don't believe the following code is doing anything stupid enough to justify a seg fault. The problem disappears is you remove the instance reference to the toolbar (self.editToolBar = editToolBar). Notice that the code is intended to reside within an SDI framework app like Mark Summerfield uses in his excellent PyQT book. The instances variables probably keep additional references around that are part of the problem. Explicitly removing the attribute, gets rid of the problem. Included below is the source code. Please let me know if this is a bug or my own stupidity. I am running python 2.5.1, pyqt 4.7.3 thanks, Danny #% import sys from PyQt4 import QtGui, QtCore, QtSql def isAlive(qobj): import sip try: sip.unwrapinstance(qobj) except RuntimeError: return False return True class MyApp(QtGui.QMainWindow): NextId = 1 Instances = set() def __init__(self, parent=None): super(MyApp, self).__init__(parent) self.setAttribute(QtCore.Qt.WA_DeleteOnClose) MyApp.Instances.add(self) self.editToolBar = self.addToolBar(Edit) self.removeToolBar(self.editToolBar) # delattr(self, 'editToolBar') # this gets rid of the seg fault self.destroyed.connect(MyApp.updateInstances) self.setCentralWidget(QtGui.QWidget()) @staticmethod def updateInstances(qobj): MyApp.Instances = set([window for window \ in MyApp.Instances if isAlive(window)]) if __name__=='__main__': application = QtGui.QApplication(sys.argv) MyApp().show() application.exec_() ___ PyQt mailing listPyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt
Re: [PyQt] memory leak using QMainWindow.removeToolBar
On 16/08/10 18:27, danny wrote: Howdy, I have run into this curious problem that I think is caused by a memory leak or improper reference counting related to toolbars in QMainWindow.removeToolBar. The problem appears when you remove a toolbar but keep an instance variable maintaining a reference to the toolbar. I am aware that removeToolBar only hides the toolbar and does not delete it. I also am aware that the following code may seem foolish, but it does show the bug. The code below is a minimal example demonstrating the problem. It is 34 lines long. Simply run the app, and close via the close box. The app will not close gracefully, but rather seg fault. This has been validated on windows and Linux. I don't believe the following code is doing anything stupid enough to justify a seg fault. The problem disappears is you remove the instance reference to the toolbar (self.editToolBar = editToolBar). Notice that the code is intended to reside within an SDI framework app like Mark Summerfield uses in his excellent PyQT book. The instances variables probably keep additional references around that are part of the problem. Explicitly removing the attribute, gets rid of the problem. Included below is the source code. Please let me know if this is a bug or my own stupidity. I am running python 2.5.1, pyqt 4.7.3 thanks, Danny #% import sys from PyQt4 import QtGui, QtCore, QtSql def isAlive(qobj): import sip try: sip.unwrapinstance(qobj) except RuntimeError: return False return True class MyApp(QtGui.QMainWindow): NextId = 1 Instances = set() def __init__(self, parent=None): super(MyApp, self).__init__(parent) self.setAttribute(QtCore.Qt.WA_DeleteOnClose) MyApp.Instances.add(self) self.editToolBar = self.addToolBar(Edit) self.removeToolBar(self.editToolBar) # delattr(self, 'editToolBar') # this gets rid of the seg fault self.destroyed.connect(MyApp.updateInstances) self.setCentralWidget(QtGui.QWidget()) @staticmethod def updateInstances(qobj): MyApp.Instances = set([window for window \ in MyApp.Instances if isAlive(window)]) if __name__=='__main__': application = QtGui.QApplication(sys.argv) MyApp().show() application.exec_() i don't think it is a bug. the real problem is with how the toolbar is being created, not with how it's being destroyed. try something like this: import sys from PyQt4 import QtGui, QtCore class MainWindow(QtGui.QMainWindow): def __init__(self, parent=None): QtGui.QMainWindow.__init__(self, parent) self._toolbar = QtGui.QToolBar('Edit', self) self.addToolBar(self._toolbar) self.removeToolBar(self._toolbar) if __name__=='__main__': app = QtGui.QApplication(sys.argv) win = MainWindow() win.show() sys.exit(app.exec_()) ___ PyQt mailing listPyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt
Re: [PyQt] memory leak using QMainWindow.removeToolBar
thanks, your solution works, and stops my code from seg faulting. I'm curious why mine doesn't work. In the documentation for QMainWindow http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qmainwindow.html#addToolBar-3 The third overloading of the addToolBar method, was what I was using. It should be equivalent, but I must be missing something. thanks, D ___ PyQt mailing listPyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt