[PyQt] Slots being called on deleted QObjects
Phil Thompson
phil at riverbankcomputing.com
Sun Apr 6 17:54:32 BST 2014
On 06-04-2014 5:39 pm, Jeremy Sanders wrote:
> Phil Thompson wrote:
>
>> 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.
>
> Thanks Phil. These are QWidgets which I'm modifying when my program
> emits a
> documentChanged() signal. There are race conditions where
> documentChanged()
> is emitted after the Qt object has been deleted. This seems quite
> nasty as
> you get random crashes which are hard to test for.
>
> Is using @pyqtSlot the only workaround? Should I be using this for
> every
> slot which does something to the QObject if the signal is emitted
> from
> Python?
Not as a general rule - only to avoid fixing your race condition
properly :)
> I assume the @pyqtSlot works because the signal is delivered via Qt
> and
> therefore never makes it because there is no Qt object.
Correct.
Phil
More information about the PyQt
mailing list