PyQt:如何将对话框创建为另一个对话框的子对象

时间:2017-05-13 18:25:52

标签: dialog pyqt parent-child

在PyQt中,我有一个生成另一个对话框的对话框(当你在第一个对话框中单击一个按钮时)。我希望保持强大的父子关系,用于垃圾收集,并使.findChild和.findChildren函数可用。

问题的根源可能是:你如何使用.setParent()但仍然将有问题的对象显示为单独的窗口,而不是在父窗口小部件中显示?

父母'对话框(实际上是对话框中选项卡中的容器小部件)是' newEntryWidget'。它产生了clueDialog'当信号(此处未显示)将newEntryWidget.quickTextClueAction调用为插槽时。在视觉上,clueDialog应该是一个顶级窗口"有自己的横幅,它自己的窗口属性(我想把它放在其他一切之上),等等。

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
...
...

现在,因为我使用的是self.parent = parent,这只是一个属性而不是真实的"父/子关系"在Qt术语中,clueDialog会显示为顶级窗口,这就是我想要的:

enter image description here

但是,如果我添加' self.setParent(parent)'在clueDialog init 函数中,我得到了这个:

enter image description here

如何保留顶级窗口行为,并拥有真正诚实的父子关系,以便.findChild(clueDialog)可以在newEntryWidget对象中工作?

最终,我想强制说,如果newEntryWidget对象仍然存在,那么它不应该被关闭,并且' child' clueDialogs打开。

1 个答案:

答案 0 :(得分:1)

而不是调用.setParent,而是调用QDialog.__init__(self, parent),它从头开始构建线索对话框。这样设置允许Qt在clueDialog的生命周期开始时建立父子关系。

我相信这会解决您的问题:1)clue窗口框架,标题等将被绘制,2)您将能够为newEntry的正确子项进行迭代。< / p>