【问题标题】:PYQT5 mdiarea how to check if Subwindow is inside workspacePYQT5 mdiarea 如何检查子窗口是否在工作区中
【发布时间】:2020-03-24 06:32:27
【问题描述】:

我目前正在使用 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: 窗口不在工作区中

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

【问题讨论】:

标签: python pyqt5 qmdiarea


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多