【发布时间】:2017-05-13 18:25:51
【问题描述】:
在 PyQt 中,我有一个生成另一个对话框的对话框(当您在第一个对话框中单击按钮时)。我想保持牢固的父子关系,用于垃圾回收,并使 .findChild 和 .findChildren 函数可用。
问题的根源可能是:您如何使用 .setParent() 但仍将相关对象显示为单独的窗口,而不是显示在父窗口小部件中?
“父”对话框(实际上是对话框中选项卡内的容器小部件)是“newEntryWidget”。当信号(此处未显示)将 newEntryWidget.quickTextClueAction 作为插槽调用时,它会生成“clueDialog”。从视觉上看,cueDialog 应该是一个“顶级窗口”,有自己的横幅、自己的窗口属性(我想把它放在其他一切之上)等等。
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 术语中的真正“父/子关系”,因此,cueDialog 确实显示为顶级窗口,这正是我想要的:
但是,如果我在线索对话框 init 函数中添加 'self.setParent(parent)',我会得到:
我怎样才能保留顶级窗口行为,并拥有真实的父子关系,以便 .findChild(clueDialog) 在 newEntryWidget 对象中工作?
最终,我想强制 newEntryWidget 对象如果仍然有并且“子”线索对话框打开,则不应关闭它。
【问题讨论】:
-
如果你使用
exec_而不是show以模态方式显示newClueDialog,它将显示自己的窗口框架并禁用newEntryWidget,以便在出现提示对话框之前无法关闭它。但不知道你要不要完全禁用 newEntryWidget? -
没想过,但是,cueDialog 应该不是模态/阻塞的。
-
当你无模式
shownewClueDialog,它没有自己的窗口框架,标题栏等,你不能通过拖动它的标题栏将它移到父级之外吗?它不像是一个永久绑定在 newEntryWidger 中的孩子,是吗?它的原始位置以父窗口为中心,但您应该能够将其拖出并以编程方式移动它。 -
是的,这很奇怪。更新了问题来说明。
-
不调用 setParent(),而是调用
QDialog.__init__(self, parent),它从一开始就与父级构建线索对话。
标签: dialog pyqt parent-child