在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会显示为顶级窗口,这就是我想要的:
但是,如果我添加' self.setParent(parent)'在clueDialog init 函数中,我得到了这个:
如何保留顶级窗口行为,并拥有真正诚实的父子关系,以便.findChild(clueDialog)可以在newEntryWidget对象中工作?
最终,我想强制说,如果newEntryWidget对象仍然存在,那么它不应该被关闭,并且' child' clueDialogs打开。
答案 0 :(得分:1)
而不是调用.setParent
,而是调用QDialog.__init__(self, parent)
,它从头开始构建线索对话框。这样设置允许Qt在clueDialog
的生命周期开始时建立父子关系。
我相信这会解决您的问题:1)clue
窗口框架,标题等将被绘制,2)您将能够为newEntry
的正确子项进行迭代。< / p>