[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pykde
Subject:    Re: [PyQt] Regressions on destruction of objects?
From:       Phil Thompson <phil () riverbankcomputing ! co ! uk>
Date:       2009-10-29 7:56:42
Message-ID: 2f90d0a7e42e08956182af2770f42726 () localhost
[Download RAW message or body]

On Thu, 29 Oct 2009 00:37:14 +0100, Giovanni Bajo <rasky@develer.com>
wrote:
> On Wed, 28 Oct 2009 22:14:41 +0000, Phil Thompson
> <phil@riverbankcomputing.co.uk> wrote:
>> On Wed, 28 Oct 2009 19:35:44 +0100, Giovanni Bajo <rasky@develer.com>
>> wrote:
>>> Hi Phil,
>>> 
>>> I'm testing PyQt 4.6.1 and SIP 4.9.1 over my small regression testsuite
>>> (it contains testcases for bugs that I have reported to you over the
>>> years and that you have fixed).
>>> 
>>> There are 4 testcases failing with the new SIP/PyQt pair, but they all
>>> seem related to the same issue. Try this one:
>>> 
>>> =====================================================================
>>> #!/usr/bin/env python
>>> from PyQt4.Qt import *
>>> 
>>> a = QObject(None)
>>> 
>>> called = []
>>> def myslot():
>>>     called.append(True)
>>> 
>>> QObject.connect(a, SIGNAL("destroyed()"), a, SIGNAL("QUIT()"))
>>> QObject.connect(a, SIGNAL("destroyed()"), myslot)
>>> QObject.connect(a, SIGNAL("QUIT()"), myslot)
>>> 
>>> del a
>>> assert len(called) == 2, len(called)
>>> =====================================================================
>>> 
>>> I would say this should work, right?
>> 
>> Fixed in tonight's PyQt snapshot (and test added to the test suite).
> 
> Can you send me the patch please?

Attached.

Phil
["destroyed.diff" (text/x-diff)]

--- PyQt/trunk/4/qpy/QtCore/qpycore_pyqtproxy.cpp (revision 2662)
+++ PyQt/trunk/4/qpy/QtCore/qpycore_pyqtproxy.cpp (revision 2674)
@@ -217,7 +217,10 @@
     // by making the proxy a child of the transmitter.  This doesn't work as
     // expected because QWidget destroys its children before emitting the
-    // destroyed signal.)
+    // destroyed signal.)  We use a queued connection in case the proxy is also
+    // connected to the same signal and we want to make sure it has a chance
+    // to invoke the slot before being destroyed.
     if (qtx)
-        connect(qtx, SIGNAL(destroyed(QObject *)), SLOT(disable()));
+        connect(qtx, SIGNAL(destroyed(QObject *)), SLOT(disable()),
+                Qt::QueuedConnection);
 }
 


_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic