Python PYQT5 MDI区域如何检查子窗口是否在工作区内

Python PYQT5 MDI区域如何检查子窗口是否在工作区内,python,pyqt5,qmdiarea,Python,Pyqt5,Qmdiarea,我目前正在编写一个pyqt5应用程序,其中包含几个使用qmdiarea和mdisubwindows的小部件。 我有一个显示图像的主子窗口和几个与该主子窗口相关联的小部件。 最终,我想摆脱所有的小部件。 虽然我收到了一条警告消息,而不是一个错误,但我希望删除此警告消息 这是我创建子窗口的方式以及关闭子窗口的方式: 子窗口创建: self.LUTobj = QMdiSubWindow() self.DATAobj = QMdiSu

我目前正在编写一个pyqt5应用程序,其中包含几个使用qmdiarea和mdisubwindows的小部件。 我有一个显示图像的主子窗口和几个与该主子窗口相关联的小部件。 最终,我想摆脱所有的小部件。 虽然我收到了一条警告消息,而不是一个错误,但我希望删除此警告消息

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

子窗口创建:

        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:窗口不在工作区内


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

警告消息表示您要删除已删除或从未属于QMD区域的QMD窗口。因此,为了避免这些错误,您应该验证qmdusubwindow是否在使用
subWindowList()
方法添加的qmdusubwindows列表中:

if self.LUTobj in self.mdiArea.subWindowList():
    self.mdiArea.removeSubWindow(self.LUTobj)
如果要删除所有QMB窗口,则只需迭代上一个列表:

for w in self.mdiArea.subWindowList(): 
    self.mdiArea.removeSubWindow(w)
另一方面,如果您想通过按“X”按钮将其删除,则可以启用Qt::WA_DeleteOnClose属性,该属性将导致QMdiSubWindow被删除,方法是通知QMdiArea将其从列表中删除

sub_window.setAttribute(Qt.WA_DeleteOnClose)

在self.mdiArea.subWindowList()中为w提供
:self.mdiArea.removeSubWindow(w)