[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