[PySide] QObject.destroyed() is not emitted
Stephan Deibel
sdeibel at wingware.com
Wed Nov 28 15:33:23 CET 2012
Alexey Vihorev wrote:
>
> Got problems with the following code:
>
> from PySide import QtCore
>
> def onDestroy(*args):
>
> print('destroyed')
>
> obj = QtCore.QObject()
>
> obj.destroyed.connect(onDestroy)
>
> The onDestroy() method is not called, unless del(obj) is called
> explicitly. In PyQt4 it is called without del(obj). Is that a bug or
> intended behavior? I’m using Qt 4.8.2, PySide 1.1.2 32bit, Windows 7-64
>
Since no one responded I'll take a stab at this:
I suspect the life cycle of the QObject under PySide is a little
different and the instance will be deleted later during garbage
collection and not immediately when it goes out of scope. I'm actually
not sure why that is happening in PyQt (seems slightly surprising).
In general if you want to make sure an instance is deleted at a
particular moment in time, you need to delete it explicitly. By that, I
mean calling some sort of delete method (in PySide I think it's
shiboken.delete(obj) and not just "del obj". The latter just deletes
your reference to the instance but doesn't destroy the instance until
all other references are gone and it is garbage collected. Of course
calling shiboken.delete(obj) will be a problem if you still have other
references and try to use them!
There is also obj.deleteLater() which marks an object for deletion but
it's not deleted until the event loop is reached again. Depending on
what you're doing this may be a safer way to delete it.
At first I thought this might be a refcount bug in PySide. However, I'm
thinking not since "del obj" just deletes your reference to it and if
there were extra references hanging around (either on purpose or as a
result of a refcount bug) then it would not be deleting the instance at
all even after "del obj".
I don't understand PySide internals that well so it's possible I'm
missing some subtlety here. I'm going more on my knowledge of Python in
general.
- Stephan
More information about the PySide
mailing list