본문 바로가기
[Framework] - PyQT

#0. closeEvent

by Bebsae 2020. 12. 28.

다이얼로그를 띄운 상태에서 해당 다이얼로그를 띄우는 버튼을 누르면 중복되서 띄워지는 현상이 발생했다.. -_-;; 그래서 혼자 예외처리를 한 결과..

 

if not self.dialog_legend:
    DialogLegend(....)

다이얼로그 객체가 존재하지 않은 경우에만 띄우도록 예외처리를 했다. 그랬더니 문제가 발생했다.

 

중복되는 현상은 방지할 수 있었지만, 창을 닫고나서 두 번째부터 창을 띄울 수 없게 된 것이다. 이는 다이얼로그 객체가 남아있게 때문에 해당 조건문을 만족시키지 않기 때문이었다. 그렇다면 해당 객체를 없애냐? 그렇게 되면 이벤트가 발생하지 않는 좀비상태로 빠져버리고 말것이다..

 

그 순간! 옆에 계신 선배님이 팁을 주셨다. closeEvent 

 

class DialogLegend(QDialog, FORM_CLASS, ):

    def __init__(self, ...):
        ...
        self.isClosed = False // 닫힌 여부를 판단하는 플래그 선언
        ...
        
    def closeEvent(self, e) -> None:
        self.isClosed = True
        e.accept()

QDialog 클래스를 보면 닫힐 때 이벤트를 정의할 수 있다. 이를 통해 플래그를 True로 변경하고 밖에서 이를 참조하면 된다. 

 

# 최초 실행할 때가 아닐 때
if self.dialog_legend:
  if not self.dialog_legend.isClosed:
  	return self.dialog_legend.showNormal()

# 최초 실행시
self.dialog_legend = DialogLegend(...)

여기서 showNormal은 QWidgets 클래스의 메소드이다. 최초 실행시 self.dialog_legend 인스턴스는 None이 아니게 된다. 그 다음부터는 위에 있는 조건문을 타면서 isClosed를 참조하며 창이 닫혀있는지 여부를 판단하고 showNormal을 호출하게 된다. (크기에 따라 다양하게 show를 할 수 있다.)

'[Framework] - PyQT' 카테고리의 다른 글

# 3. [Utils] QCheckBoxUtils  (0) 2021.08.04
# 2. [Util] QTableWidgetUtils  (0) 2021.05.06
# 1. QSplitter  (0) 2021.05.06

댓글