[PyKDE] Issue with QDialog and lifetime
Giovanni Bajo
rasky at develer.com
Thu Jul 7 12:27:53 BST 2005
Phil Thompson <phil at riverbankcomputing.co.uk> wrote:
>> The problem is that the idiomatic way of using modal dialogs in C++ is to
>> create local variables, which gets destroyed when their scope finishes
>> (when
>> the function exits). Moreover, the dialogs have to be children of
whatever
>> widgets they are modal over (e.g. the main window).
>>
>> This has no direct translations in PyQt. If you do:
>>
>> def slotWhatever(self):
>> dlg = MyModalDialog(self)
>> if dlg.exec_loop() == QDialog.Accepted:
>> return dlg.data()
>> return None
>>
>> you are leaking "dlg" because its lifetime is bound to its parent. The
>> current common workaround is something like:
>>
>> def slotWhatever(self):
>> dlg = MyModalDialog(self)
>> try:
>> if dlg.exec_loop() == QDialog.Accepted:
>> return dlg.data()
>> return None
>> finally:
>> dlg.deleteLater()
>>
>> which is ugly and error-prone (you have to remember to do it).
>>
>> James proposed this solution:
>>
>> def slotWhatever(self):
>> dlg = MyModalDialog(self)
>> sip.transfer(dlg, 0)
>> if dlg.exec_loop() == QDialog.Accepted:
>> return dlg.data()
>> return None
>>
>> and then proposed to hardcode the transfer() call within the %MethodCode
>> for
>> QDialog.exec_loop. I'll remember you that exec_loop is called only for
>> modal
>> dialogs, while for modeless dialogs show() is called.
>
> I'm uncomfortable with this for two reasons...
>
> 1. It's inconsistent behaviour. As there are things you need to be aware
> of when using PyQt (particularly with regard to ownership) I think it's
> important to have consistency in those things.
>
> 2. It creates the strong possibility of a seg fault for those (existing)
> applications that don't follow the common idiom.
Yeah, I understand. Better ideas?
> What's wrong with just passing WDestructiveClose in the dialog's ctor call
> to QDialog.__init__()?
If you do so, you are not able to access the dialog properties after the
dialog is closed by the user, which is a very common scenario (see my
example above).
> I've no problem with adding this issue to the
> documention.
Yes, this should really be documented, no matter what the outcome of this
discussion is.
--
Giovanni Bajo
More information about the PyQt
mailing list