본문으로 바로가기
반응형

QWidget 에서는 가상함수 changeEvent() 를 제공합니다. 이 가상 함수를 오버라이딩하면 윈도우에 변화가 있을 때 마다 이벤트를 받아 처리할 수 있습니다. 윈도우 창의 상태를 구분하는 방법은 매개변수로 전달받는 QEvent 객체로 이용하는 것입니다. 윈도우 화면의 최대, 최소 구분은 QEvent type 으로 가능합니다.

 

Qt5 사이트에 가면 QWidget 의 가상함수 중 changeEvent() 가 있는 것을 확인할 수 있습니다. 함수 원형에서 확인할 수 있듯이 매개변수로 QEvent 객체를 받습니다.

 

QEvent 객체의 type() 함수를 통해 상수값을 받을 수 있는데, 아래 표를 보면 알 수 있듯이 상수로 최대/최소를 구분할 수 있습니다. 이벤트의 종류는 다음과 같이 다양합니다. 아래 사이트를 참고하시기 바랍니다.

https://doc.qt.io/qt-5/qevent.html

 

먼저 QWidget 에서 제공하는 가상함수 changeEvet() 를 오버라이딩(Overriding) 해서 윈도우 상태변화가 있을 때 이벤트를 받을 수 있는 구조로 만듭니다.

#-*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 윈도우 설정
        self.setGeometry(300, 300, 500, 300)  # x, y, w, h
        self.setWindowTitle('Status Window')

    # QMainWindow 에서 제공하는 이벤트 함수
    def changeEvent(self, event):
        print('window event call')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

 

윈도우를 최소/최대화 할 때 마다 콜백함수인 changeEvent() 가 실행됩니다. changeEvent() 함수내에 print() 를 추가해서 콘솔에 텍스트를 출력했습니다.

 

다음은 콜백함수인 changeEvent() 함수로부터 넘겨 받은 event(PyQt5.QtCode.QEvent) 객체를 통해 윈도우 최소화/최대화를 구분하는 소스를 구현하겠습니다. 함수 내부는 아래와 같습니다. QEvent 객체의 type() 함수를 호출해서 리턴받은 enum(열거형) 상수값을 윈도우 상태변화인지 체크합니다.

from PyQt5.QtCore import QEvent, Qt

# QMainWindow 에서 제공하는 이벤트 함수
def changeEvent(self, event):
    if event.type() == QEvent.WindowStateChange:
        ....

 

다음 단계로 넘어가서 if 문을 이용해 윈도우 최대값인지, 아니면 최소값인지 판단합니다. QWidget 은 현재 윈도우 상태값을 알 수 있는 windowState() 함수를 제공합니다. 반환하는 값은 상태를 나타내는 WindowStates 상수값입니다. windowState() 함수의 리턴값과 윈도우 최소화 상태값 상수인 WindowMinimized 를 비교해서 최소화 여부를 판단합니다. 두 번째 최대화를 판단할 때는 self.windowState() 함수를 사용하지 않습니다. 반드시 event.oldState() 함수로 체크해야 합니다. 이 함수는 윈도우 이전 상태 정보를 알아오는데, 최대화 이전에 최소화였으므로 일치하는 것입니다.

def changeEvent(self, event):
    if event.type() == QEvent.WindowStateChange:
        if self.windowState() & Qt.WindowMinimized:
            print('changeEvent : 최소화 실행 ')
        elif event.oldState() & Qt.WindowMaximized:
            print('changeEvent : 원래화면 복구, 최대화 실행 ')

 

changeEvet() 함수의 매개변수로 넘어오는 상수값 QEvent.WindowStateChange 의 상세 내용은 아래 사이트 링크에서 확인할 수 있습니다. 어떤 이벤트 타입들이 존재하는지 알고 싶다면 사이트 주소를 참조하시기 바랍니다.

https://doc.qt.io/qt-5/qt.html#WindowState-enum

반응형