9.9 프로그램 종료
728x90

1. 목표
더보기
- File 메뉴의 Close 항목과 단축키 Ctrl+Q 를 눌렀을 때 프로그램이 정상적으로 종료되도록 구현한다
- 메인 윈도우를 닫으면 Qt 이벤트 루프가 종료되고, 파이썬 프로세스가 끝나는 흐름을 이해한다
- Qt Designer 에서 만든 QAction 과 파이썬 슬롯 메서드를 연결하는 패턴을 복습한다
- 이후 단계에서 종료 전에 변경 내용을 저장하는 기능으로 확장할 수 있는 기반을 만든다
2. 전체 로직
더보기
# mainwindow.py
. . .
class MainWindow(QMainWindow):
def __init__(self, parent=None):
. . .
self.ui.actionClose.triggered.connect(self.exit_app)
. . .
def exit_app(self):
self.close()
# main.py
import sys
from PySide6.QtWidgets import QApplication
from mainwindow import MainWindow
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec())
3. 필요한 import + 주석 설명
더보기
동일
4. 메뉴 액션과 슬롯 연결하기 (actionClose↔ exit_app)
더보기


class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# QTextEdit 별칭 등 다른 초기화 코드가 먼저 온다
self.editor = self.ui.textEdit
# 9.9 프로그램 종료 기능
# File 메뉴의 Close 항목과 툴바 아이콘, 단축키 Ctrl+Q 는
# 모두 actionClose 에 연결되어 있다
# 여기서 그 시그널을 MainWindow.exit_app 슬롯에 연결한다
self.ui.actionClose.triggered.connect(self.exit_app)
- QAction 이름 actionClose
- File 메뉴에 추가되어 있고
- 단축키는 Ctrl+Q 로 설정되어 있다
5. 프로그램 종료 기능 구현 함수
더보기


def exit_app(self):
# 프로그램을 종료하는 기능을 담당하는 슬롯 메서드이다
# 이 메서드는 File 메뉴의 Close 액션이 눌렸을 때 호출된다
# 학습용으로 콘솔에 로그를 남긴다
# 실제 배포용 프로그램에서는 생략 가능하다
print("프로그램을 종료합니다")
# QMainWindow.close 메서드를 호출하면
# 메인 윈도우가 닫히고, 그 결과로 QApplication 이벤트 루프가 끝난다
# main.py 에서 sys.exit(app.exec()) 로 이벤트 루프를 기다리고 있으므로
# 여기서 close 가 호출되면 app.exec() 이 반환되고 프로그램이 완전히 종료된다
self.close()
좀 더 발전시키고 싶다면
- 종료 전에 maybe_save 를 호출해 수정된 내용을 저장할지 물어본다
- 사용자가 취소를 선택하면 종료를 막는다
6. 실행 테스트
7. 학습 주요 포인트
더보기
Qt 애플리케이션의 종료 흐름 이해
- main.py 에서 QApplication 인스턴스를 만들고 app.exec 으로 이벤트 루프를 실행한다
- 메인 윈도우가 닫히면 이벤트 루프가 종료되고 app.exec 이 반환된다
- 그 반환값을 sys.exit 로 넘겨 주면 운영체제에 종료 코드를 전달하면서 프로세스가 끝난다
QAction 과 슬롯 연결 패턴 복습
- Qt Designer 에서 만든 QAction(actionClose) 을
파이썬 코드에서 self.ui.actionClose.triggered.connect(self.exit_app) 으로 연결한다 - 이 패턴은 저장, 열기, 프린트, PDF 내보내기, 편집 기능 등
모든 메뉴 기능에서 반복해서 사용되는 기본 구조이다
종료 기능은 단순하지만 중요하다
- 파일 저장, 인쇄 같은 기능은 코드가 길고 복잡하지만
종료 기능은 self.close 한 줄이면 동작한다 - 하지만 프로그램 전체 생명주기의 마지막 단계이므로
나중에 변경 내용 저장, 로그 남기기, 리소스 정리 등
중요한 처리가 모이는 지점이기도 하다
이전 단계와의 연결 의식하기
- 9.3, 9.4, 9.5 단계에서 QFile, QTextStream 기반 파일 저장과 불러오기를 구현했다면
9.9 단계에서 종료 전에 maybe_save 를 호출해
수정된 내용을 저장할지 물어보는 구조로 자연스럽게 확장할 수 있다 - 이렇게 하면 프로그램 종료 기능이
단순히 창만 닫는 역할이 아니라
데이터 손실을 막는 안전장치 역할까지 수행하게 된다
PySide6 문법과 파이썬 기본 문법의 역할 분리
- 종료 자체는 파이썬의 sys.exit 도 가능하지만
Qt 애플리케이션에서는 보통 위젯의 close 메서드를 통해 종료를 유도한다 - 파일 저장, 불러오기 같은 작업은 이 프로젝트에서는
파이썬 open 대신 Qt 의 QFile, QTextStream 으로 구현하는 방향을 이미 잡았으므로
종료 단계에서는 이 기능들을 조합해 안전한 종료 흐름을 설계한다는 관점으로 설명해 줄 수 있다
단계별 완성 파일

