[PyQt] why do closeEvent and destroyed slot not get called on accepting PyQt4 QDialog?

Rui DaCosta ruidc at yahoo.com
Thu Apr 7 16:28:45 BST 2011


just to be clear, I wasn't trying to use destroy(), I was merely using it to 
demonstrate that even if I did, neither the closeEvent nor the destroyed signal 
were working.




________________________________
From: Demetrius Cassidy <dcassidy36 at gmail.com>
To: Rui DaCosta <ruidc at yahoo.com>
Cc: pyqt at riverbankcomputing.com
Sent: Thu, 7 April, 2011 17:18:29
Subject: Re: [PyQt] why do closeEvent and destroyed slot not get called on 
accepting PyQt4 QDialog?

Sorry found destroyed() - that's what happens when you reply to emails before 
you have morning coffee. Anyway I'm not sure why destroyed() is never fired. I 
tried your code and even modified it a bit to use the new style slots and 
signals but it's not being fired.


Either way, I think the other points I raised in my last email are still valid. 
IMHO using destroyed() in python is the wrong approach.

On Thu, Apr 7, 2011 at 11:02 AM, Demetrius Cassidy <dcassidy36 at gmail.com> wrote:

I truly believe you are approaching this from the wrong angle. If you need to 
know when your QDialog is going away, you override closeEvent and do your 
cleanup from there. 
>
>
>However, looking through the docs, it does not appear that destroy is actually a 
>signal. It's called from the QWidget dtor, so it makes sense that if you call 
>destroy(), you get the runtime error because you are deleting the C++ object 
>before the Python object. Do not call destroy yourself - call self.close and 
>override closeEvent. From there you can accept or reject closing the dialog, and 
>do any cleanup prior to your dialog being destroyed.
>
>
>From the Qt Docs:
>
>
>void QWidget::destroy ( bool destroyWindow = true, bool destroySubWindows = true 
>) [protected]
>
>Frees up window system resources. Destroys the widget window if destroyWindow is 
>true.
>
>destroy() calls itself recursively for all the child widgets, passing 
>destroySubWindows for the destroyWindow parameter. To have more control over 
>destruction of subwidgets, destroy subwidgets selectively first.
>
>This function is usually called from the QWidget destructor.
>
>
>
>On Thu, Apr 7, 2011 at 3:04 AM, Rui DaCosta <ruidc at yahoo.com> wrote:
>
>I know it can close it manually, the problem is that this is a simplification of 
>a problem I had, in which we were expecting the QDialog to close as per the 
>docs, but it did not.
>>The *real* problem we are facing, is a bit further down the line, where we are 
>>getting the "RuntimeError: underlying C/C++ object has been deleted" but we 
>>never receive a destroyed signal.
>>The only reason I need this signal or event is to do some teardown code for some 
>>callbacks to avoid getting this c++ error elsewhere.
>>
>>
>>
>>
________________________________
From: Demetrius Cassidy <dcassidy36 at gmail.com>
>>To: RuiDC <ruidc at yahoo.com>
>>Sent: Thu, 7 April, 2011 0:39:33
>>Subject: Re: [PyQt] why do closeEvent and destroyed slot not get called on 
>>accepting PyQt4 QDialog?
>>
>>
>>If you want to close, just call self.close. It's a slot, so you can map it to 
>>any signal. Also not sure why you want to know when your widget is destroyed? 
>>Let Python take care of it, you should not need to call sip.delete yourself. 
>>closeEvent is there if you need to know _when_ your app was requested to close. 
>>If you want to allow or reject closing the app, you need to use the QEvent 
>>object which gets passed to that function. 
>>
>>
>>On Wed, Apr 6, 2011 at 5:27 PM, RuiDC <ruidc at yahoo.com> wrote:
>>
>>
>>>The question & code are here:
>>>http://stackoverflow.com/questions/5570402/why-do-closeevent-and-destroyed-slot-not-get-called-on-accepting-pyqt4-qdialog
>>>
>>>
>>>but hopefully someone here can give me an answer on:
>>>1. how to get the closeEvent to fire from accepting (or do I have to do a
>>>self.close()?)
>>>2. how to get the destroyed message to print (or do I have to go through
>>>sip.delete(my_widget)?)
>>>3. why, if I comment out the del my_widget, and uncomment the
>>>my_widget.destroy() I get a:
>>>RuntimeError: underlying C/C++ object has been deleted
>>>on the destroy() without the print!  i.e. how is it that it can be destroyed
>>>but not raise the signal?
>>>
>>>Thanks in advance,
>>>R
>>>--
>>>View this message in context: 
>>>http://old.nabble.com/why-do-closeEvent-and-destroyed-slot-not-get-called-on-accepting-PyQt4-QDialog--tp31336229p31336229.html
>>>
>>>Sent from the PyQt mailing list archive at Nabble.com.
>>>
>>>_______________________________________________
>>>PyQt mailing list    PyQt at riverbankcomputing.com
>>>http://www.riverbankcomputing.com/mailman/listinfo/pyqt
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20110407/e40953cd/attachment.html>


More information about the PyQt mailing list