PYQT5 mdiarea, как проверить, находится ли подокно внутри рабочей области

В настоящее время я пишу приложение 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: окно не находится внутри рабочей области

Любая подсказка о том, как проверить, находится ли окно внутри рабочей области?


person ROBOTechnics    schedule 28.11.2019    source источник
comment
предоставьте минимальный воспроизводимый пример   -  person eyllanesc    schedule 28.11.2019


Ответы (1)


Предупреждающее сообщение указывает, что вы хотите удалить QMdiSubWindow, который уже был удален или никогда не был частью QMdiArea. Поэтому, чтобы избежать этих ошибок, вы должны убедиться, что QMdiSubWindow находится в списке QMdiSubWindows, добавленных с помощью метода subWindowList():

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, который приведет к удалению QMdiSubWindow, уведомив QMdiArea, также удалив его из своего списка.

sub_window.setAttribute(Qt.WA_DeleteOnClose)
person eyllanesc    schedule 28.11.2019