[PyKDE] Issue with QDialog and lifetime
Phil Thompson
phil at riverbankcomputing.co.uk
Mon Jul 25 19:26:01 BST 2005
On Thursday 07 July 2005 12:27 pm, Giovanni Bajo wrote:
> 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.
Ok, this is in tonight's PyQt snapshot.
Phil
More information about the PyQt
mailing list