1

我目前正在使用 qmdiarea 和 mdisubwindows 编写一个带有多个小部件的 pyqt5 应用程序。我有一个显示图像的主子窗口和与该主子窗口关联的几个小部件。最终,我想摆脱所有附件小部件。虽然我收到一条警告消息,而不是错误,但我想摆脱这个警告消息。

这是我创建子窗口以及关闭它们的方式:

子窗口创建:

        self.LUTobj         = QMdiSubWindow()    
        self.DATAobj        = QMdiSubWindow()    
        self.MEASUREobj     = QMdiSubWindow()    
        self.REFERENCEobj   = QMdiSubWindow()    
        self.SPATIALRESOLobj= QMdiSubWindow()    
        self.LINEPROFILEobj = QMdiSubWindow()    
        self.SNRobj         = QMdiSubWindow()   
        self.CNRobj         = QMdiSubWindow()   

子窗口删除:

def closeSubwindowObject(self):

        if self.LUTobj is not None:
            self.mdiArea.removeSubWindow (self.LUTobj)

        if self.DATAobj is not None:
            self.mdiArea.removeSubWindow (self.DATAobj)

        if self.MEASUREobj is not None:
            self.mdiArea.removeSubWindow (self.MEASUREobj)

        if self.REFERENCEobj is not None:
            self.mdiArea.removeSubWindow (self.REFERENCEobj)

        if self.SPATIALRESOLobj is not None:
            self.mdiArea.removeSubWindow (self.SPATIALRESOLobj)

        if self.LINEPROFILEobj is not None:
            self.mdiArea.removeSubWindow (self.LINEPROFILEobj)

        if self.SNRobj is not None:
            self.mdiArea.removeSubWindow (self.SNRobj)

        if self.CNRobj is not None:
            self.mdiArea.removeSubWindow (self.CNRobj)

这是显示的警告消息:

QMdiArea::removeSubWindow:窗口不在工作空间内

关于如何检查窗口是否在工作区内的任何线索?

4

1 回答 1

1

警告消息表明您要删除已被删除或从未成为 QMdiArea 一部分的 QMdiSubWindow。因此,为了避免这些错误,您应该验证 QMdiSubWindow 是否在使用以下subWindowList()方法添加的 QMdiSubWindows 列表中:

if self.LUTobj in self.mdiArea.subWindowList():
    self.mdiArea.removeSubWindow(self.LUTobj)

如果要删除所有 QMdiSubWindow 则只需遍历上一个列表:

for w in self.mdiArea.subWindowList(): 
    self.mdiArea.removeSubWindow(w)

另一方面,如果您想通过按“X”按钮将其删除,则可以启用 Qt::WA_DeleteOnClose 属性,该属性将通过通知 QMdiArea 将其从其列表中删除来导致 QMdiSubWindow 被删除

sub_window.setAttribute(Qt.WA_DeleteOnClose)
于 2019-11-28T15:23:42.003 回答