[PyQt] Slots being called on deleted QObjects

Phil Thompson phil at riverbankcomputing.com
Sun Apr 6 16:59:04 BST 2014


On 06-04-2014 4:08 pm, Jeremy Sanders wrote:
> I'm still getting numerous bug reports from users where slots are 
> called on
> deleted QObjects, giving a crash. As I previously reported, changing 
> these
> to new style signals and using "@pyqtSlot" on the slot appears to 
> prevent
> these bugs, but it's very hard to find every case.
>
> Looking through the source code of sip (siplib/qtlib.c), it says:
>
>         /*
>          * We used to check that any wrapped C++ object still existed 
> and
> just
>          * returning None if it didn't.  This caused inconsistent 
> behaviour
>          * when the slot was a method connected to its object's 
> destroyed()
>          * signal.
>          */
>
> I assume this is the code used to call slots on QObjects? Is this the 
> reason
> why I started getting these problems a year or two ago?

The change appeared in v4.13.3 released June 2012.

> If this is the problem, is it possible to make the code more 
> intelligent and
> check if the C++ object is there as long as the signal isn't 
> destroyed()?

That would be an incompatible change. Any slot can be called from any 
signal. The problem only arises if you try to do something that requires 
the underlying C++ QObject. The comment mentions destroyed() only 
because that was the context in which the bug was reported (and it is 
guaranteed to happen with that particular signal) but it can apply to 
any signal.

Phil


More information about the PyQt mailing list