[PyKDE] QApplication.notify gets QObject receiver args

Alan Harkreader alh at jenkon.com
Fri Apr 26 21:18:00 BST 2002


Update: Extending qt.QApplication & overriding notify appears
to cause a memory leak.

Details: We discovered that the original code sample I posted
also displays a memory leak (with which we have also been struggling).
In the course of investigating that, I've simplified the example
code (minimizing py<->qt interaction) & found that the memory
leak is due to extending qt.QApplication and overriding notify. The 
code below demonstrates this, in addition to the original
complaint of args tending toward QObjects. Memory does not seem to
leak if class App is stubbed-out (i.e., class App(qt.QApplication): pass).
Now to isolate the leak...

Alan Harkreader


##################################################################
import sys
import qt

class App(qt.QApplication):
    def notify(self, receiver, event):
        if event.type() == qt.QEvent.FocusIn:
            print 'focus-in', receiver
        return qt.QApplication.notify(self, receiver, event)

class Toggle:
    wnd = None
    def __call__(self):
        if self.wnd:
            print 'close', self.wnd
            self.wnd.close(1)
            self.wnd = None
        else:
            self.wnd = qt.QMainWindow()
            main = qt.QWidget(self.wnd)
            self.wnd.setCentralWidget(main)
            layout = qt.QVBoxLayout(main)
            layout.addWidget(qt.QLineEdit(main))
            layout.addWidget(qt.QLineEdit(main))
            self.wnd.show()
            print 'open', self.wnd
Toggle = Toggle()

if __name__ == '__main__':
    app = App(sys.argv)
    wnd = qt.QMainWindow()
    btn = qt.QPushButton('Click', wnd)
    btn.resize(btn.sizeHint())
    btn.connect(btn, qt.SIGNAL('clicked()'), Toggle)
    wnd.show()
    app.connect(app, qt.SIGNAL('lastWindowClosed()'), app, qt.SLOT('quit()'))
    app.exec_loop()







More information about the PyQt mailing list