본문 바로가기

컴퓨터, IT/프로그래밍

[파이썬] PyQt5 창 닫힐 때 이벤트 실행하기

반응형

파이썬에서 PyQt5를 이용해서 GUI를 구성한 코딩을 할 때 창이 닫히는 순간 특정 이벤트를 실행하게 할 수 있습니다.

예를 들어 창이 닫힐 때 "정말 닫을건가요?" 라고 묻는 팝업 창을 띄울 수 있습니다.

 

PyQt5.QtWidgets의 closeEvent 메소드를 오버라이드 하는 방법입니다.

 

파이참 IDE환경에서 Ctrl + B를 누르면 Import한 클래스나 함수에서 정의하고 있는 코드로 들어갈 수 있습니다.

아래 코드에서 메인윈도우가 상속받고 있는 Q메인윈도우에 커서를 올리고 Ctrl + B를 누르면 Q메인윈도우의 소스코드로 접근할 수 있습니다.

Q메인윈도우 안에 closeEvent라는 함수가 있는데요,

해당 함수는 비어있지만 오버라이딩 해서 특정한 기능을 심어놓으면 창이 종료될 때 실행되게 됩니다.

def closeEvent(self, *args, **kwargs): # real signature unknown
    pass

 

비어있는 closeEvent에 내용을 채워주면,

GUI 창 종료시 채워준 내용이 실행되게 되는 것이지요.

 

밑의 예제 코드블럭에서 def closeEvent 는 MainWindow가 받고있는 QMainWindow의 동일한 이름의 메소드를 오버라이딩 합니다. 오버라이딩된 함수의 경우 IDE마다 다르긴 하지만 좌측에 디스크모양 등으로 표시를 해주는게 일반적입니다.

 

from PyQt5.QtWidgets import *


class MainWindow(QMainWindow, form_class):
    
    class MainWindow(QMainWindow, form_class):
        def __init__(self, data_queue, order_queue, realtime_queue):
            super().__init__()
            self.setupUi(self)
            self.kw = Kiwoom(data_queue, order_queue, realtime_queue)
            
    def closeEvent(self, event):
        quit_msg = "Want to exit?"
        reply = QMessageBox.question(self, 'Message', quit_msg, QMessageBox.Yes, QMessageBox.No)

        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

 

 

코딩할 때 자주 참조하게 되는,

스택오버플로우에서 참조한 내용을 링크해둡니다.

https://stackoverflow.com/questions/1414781/prompt-on-exit-in-pyqt-application

 

Prompt on exit in PyQt application

Is there any way to promt user to exit the gui-program written in Python? Something like "Are you sure you want to exit the program?" I'm using PyQt.

stackoverflow.com

 

 

 

 

출처: 픽사베이 (https://pixabay.com/images/id-1209641/)