【问题标题】:PyQt: how to create a dialog as a child of another dialogPyQt:如何创建一个对话框作为另一个对话框的子级
【发布时间】: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


【解决方案1】:

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

我相信这将解决您的两个问题:1) clue 窗口框架、标题等将被绘制,2) 您将能够迭代 newEntry 的适当子代。

【讨论】:

  • 感谢原始问题中每个 cmets 的帮助,这成功了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
相关资源
最近更新 更多