PyQt: how to create a dialog as a child of another dialog

Viewed 2116

In PyQt, I have a dialog that spawns another dialog (when you click a button to do so in the first dialog). I want to maintain a strong parent-child relationship, for garbage collection purposes, and to make the .findChild and .findChildren functions usable.

The root of the question may be: how do you use .setParent() but still have the object in question be shown as a separate window, rather than shown within the parent widget?

The 'parent' dialog (actually a container widget within a tab within a dialog) is 'newEntryWidget'. It spawns 'clueDialog' when a signal (not shown here) calls newEntryWidget.quickTextClueAction as a slot. Visually, clueDialog should be a "top level window" with its own banner, its own window attributes (I want to keep it on top of everything else), etc.

class newEntryWidget(QWidget,Ui_newEntryWidget):
    def __init__(self,parent,sec=0,formattedLocString='',fleet='',dev='',origLocString='',amendFlag=False,amendRow=None):
        QDialog.__init__(self)
        self.parent=parent # just an attribute; not the same as setParent
...
...
    def quickTextClueAction(self):
            self.newClueDialog=clueDialog(self,self.ui.timeField.text(),self.ui.teamField.text(),self.ui.radioLocField.text(),lastClueNumber+1)
            self.newClueDialog.show()


class clueDialog(QDialog,Ui_clueDialog):
    def __init__(self,parent,t,callsign,radioLoc,newClueNumber):
        QDialog.__init__(self)
        self.parent=parent # just an attribute; not the same as setParent
...
...

Right now, since I am using self.parent=parent, which is just an attribute and not true "parent/child relationship" in Qt terms, clueDialog does display as a top level window, which is what I want:

enter image description here

But, if I add 'self.setParent(parent)' in the clueDialog init function, I get this:

enter image description here

How can I preserve the top-level-window behavior, and have the real-honest-parent-child-relationship so that .findChild(clueDialog) will work from within the newEntryWidget object?

Ultimately, I want to enforce that the newEntryWidget object should not be closed if it still has and 'child' clueDialogs open.

1 Answers
Related