프로그래밍/Python

[Python] Qt - QWidget 사라질 때, 처리하는 방법

채윤아빠 2023. 6. 9. 18:13
728x90
반응형

개요

부모 클래스를 상속한 하위 클래스에서 여러 컨트롤을 추가하거나, 리소스를 사용하고 반환하려면 일반적으로 생성자에서 사용할 리소스를 만들거나 얻은 후, 소멸자에서 사용한 리소스를 반환하게 됩니다.
하지만, Python의 Qt에서는 gc의 의하여 때에 따라서 소멸자가 제대로 호출되지 않을 수도 있기 때문에 소멸자에서 사용한 리소스를 반환하는 것은 위험하고, 아래에 설명드리는 것과 같이 위젯이 닫힌다는 이벤트에서 처리합니다.


QWidget.closeEvent() 오버라이딩

QtWidget에서 closeEvent() 메서드를 오버라이딩하여 위젯이 닫힐 때 필요한 작업(리소스 반환 등)을 수행할 수 있습니다. closeEvent() 메서드는 위젯이 닫힐 때 호출되는 이벤트 핸들러로서, 이 메서드를 오버라이딩하여 필요한 여러 작업들을 수행할 수 있습니다.

from PyQt5.QtWidgets import QApplication, QWidget

class MyWidget(QWidget):
    def closeEvent(self, event):
        # 필요한 처리 작업 수행
        # 예: 데이터 저장, 리소스 해제 등
        print(f'closeEvent()')
        event.accept()  # 위젯을 닫음

# 예시 실행 코드
app = QApplication([])
widget = MyWidget()
widget.show()
app.exec_()

QWidget QCloseEvent 이벤트 처리하기

QtGui.QCloseEvent 이벤트 필터를 설정하여 앞서 closeEvent() 오버라이딩한 것과 동일한 처리를 할 수 있습니다. QtCore.QObject 클래스의 installEventFilter 메서드를 사용하여 위젯의 이벤트를 필터링하고, QtGui.QCloseEvent 이벤트를 처리하는 필터를 등록할 수 있습니다. 이 필터에서 필요한 여러 작업들을 수행하고, accept 메서드를 호출하여 위젯을 닫을 수 있습니다.

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.installEventFilter(self)  # 이벤트 필터 등록

    def eventFilter(self, obj, event):
        if event.type() == QEvent.Close:
            # 필요한 처리 작업 수행
            # 예: 데이터 저장, 리소스 해제 등
            print(f'QtGui.QCloseEvent')
            event.accept()  # 위젯을 닫음
            return True

        return super().eventFilter(obj, event)

# 예시 실행 코드
app = QApplication([])
widget = MyWidget()
widget.show()
app.exec_()

결론

위 두 가지 방법 모두 closeEvent() 메서드 또는 QCloseEvent 이벤트를 처리하여 위젯이 사라질 때 필요한 작업들을 수행할 수 있습니다. 상황에 맞게 적절한 방법을 선택하여 적용하시면 됩니다.


참고자료