# PyQt: 파이썬으로 Qt GUI를 다루는 바인딩의 개요 PyQt는 Python 바인딩으로서 Qt 프레임워크의 다양한 위젯과 기능을 Python으로 사용할 수 있게 해준다. Qt는 크로스 플랫폼 GUI 프레임워크로서, 윈도우, macOS, 리눅스에서 동일한 코드로 동작하는 사용자 인터페이스를 제작할 수 있게 해준다. PyQt는 Riverbank Computing이 제공하며, Qt의 주요 버전인 Qt5(또는 Qt6)에 대응하는 PyQt5(Python 3.x 기준)와 PyQt6으로 나뉜다. PyQt를 활용하면 객체 지향 프로그래밍으로 그래픽 UI를 설계하고 이벤트 기반의 애플리케이션을 구현할 수 있다. 용어 요약 - Qt: 크로스 플랫폼 GUI 프레임워크 - PyQt: Python 바인딩 - QWidget, QMainWindow: 핵심 위젯 및 창의 기본 구성요소 - QApplication: 애플리케이션의 생성 및 이벤트 루프 관리 - Signal / Slot: 이벤트 처리의 기본 모델 - Model-View: 데이터 모델과 뷰의 분리 패턴 - Designer / ui 파일: 시각적 UI 디자인 도구와 파일 형식 - pyuic: .ui 파일을 Python 코드로 변환하는 도구 --- ## 1. 개요와 역사 ### 개요 - PyQt의 주요 목적은 Qt의 풍부한 GUI 컴포넌트를 Python에서 쉽게 사용할 수 있도록 하는 것이다. - Qt의 위젯 시스템, 레이아웃 관리, 이벤트 루프, 그래픽 기능 등을 Python 코드로 제어한다. - PyQt는 PyQt5 및 PyQt6로 제공되며, 각각 Qt5/Qt6에 대응한다. API 호환성은 버전에 따라 차이가 있을 수 있다. ### 역사적 배경 - Qt 프레임워크: Trolltech에서 시작되어 이후 Nokia, Digia, The Qt Company로 이어짐. - PyQt는 2000년대 초반부터 Python 개발자들에게 Qt의 강력한 GUI 도구를 제공하기 위해 사용되기 시작했다. - 현재는 PyQt5(Python 3.x 기준) 및 PyQt6이 주요 버전으로 사용된다. --- ## 2. 설치 및 환경 구성 ### 설치 - PyQt5 설치 예시: - Python 환경에서 다음 명령으로 설치 가능: `pip install PyQt5` - Qt 디버깅 도구 및 디자인 도구를 포함한 전체 패키지는 `pip install PyQt5-tools`로 보완 가능 - PyQt6 설치 예시: - `pip install PyQt6` ### 간단한 실행 환경 예시 - 기본 애플리케이션 구조를 가진 예제: - 필수 모듈: `from PyQt5.QtWidgets import QApplication, QWidget, QLabel` - 애플리케이션 객체 생성 → 위젯 생성 → 화면 표시 → 이벤트 루프 시작 참고: PyQt5와 PyQt6은 모듈 경로와 일부 API 명칭이 다를 수 있다. 예를 들어 PyQt6에서는 Enum 접근 방식이나 일부 이름 변화가 있으므로 문서의 버전에 맞춰 코드를 작성해야 한다. --- ## 3. 기본 구성 요소 ### QApplication - Qt 애플리케이션의 진입점이며 이벤트 루프를 관리한다. - 하나의 애플리케이션 인스턴스만 생성해야 한다. ### QWidget과 QMainWindow - QWidget: 일반적인 위젯의 기본 클래스. 모든 위젯의 기본이 된다. - QMainWindow: 메뉴 바, 도구 모음, 상태 표시줄 등을 갖춘 주 창 구성에 특화된 창. ### 주요 위젯 - QLabel: 텍스트나 이미지를 표시 - QPushButton: 클릭 가능한 버튼 - QLineEdit: 한 줄 텍스트 입력 - QListView, QTableView: 목록/표 형태의 데이터를 표시 - QComboBox: 드롭다운 목록 ### 레이아웃 관리자 - QHBoxLayout: 수평 배치 - QVBoxLayout: 수직 배치 - QGridLayout: 격자형 배치 - 레이아웃의 필요성: 위젯 간의 위치와 크기를 자동으로 조정 --- ## 4. 위젯과 레이아웃의 계산과 사이즈 정책 - 위젯의 크기는 기본적으로 sizeHint, minimumSizeHint를 기반으로 결정된다. - 레이아웃의 stretch 요인: 같은 라인에서 위젯의 상대적 확장을 제어한다. - 비율 관리의 개념은 화면의 가로/세로 비율로 표현되기도 한다. 예를 들어, 비율은 $width / height$로 표현될 수 있다. - 실제 프로젝트에서는 사용자 인터페이스의 해상도 차이를 고려해 고정 크기보다 유연한 레이아웃 설계를 권장한다. --- ## 5. 이벤트 모델: Signals and Slots PyQt의 이벤트 시스템은 Signals(신호)와 Slots(슬롯)로 구성된다. - 신호: 위젯의 이벤트 발생 시 방출되는 메시지 - 슬롯: 신호를 받아 반응하는 함수나 메서드 예시(Python 코드, PyQt5 기준): - 버튼 클릭에 반응하는 슬롯 연결 - `button.clicked.connect(on_click)`에서 on_click은 슬록 - `def on_click(): print("Button clicked")` 다양한 연결 방법 - 슬롯으로 일반 함수 사용 - 슬롯으로 람다 함수 사용 - 다른 QObject의 메서드를 슬롯으로 연결 버전 간 차이 - PyQt5와 PyQt6에서 시그널의 연결 방식은 동일하게 작동하지만, 일부 네임스페이스와 Enum 접근 방식에 차이가 있을 수 있다. --- ## 6. Hello PyQt 예제 아래는 PyQt5를 이용한 간단한 창 예제이다. ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout def on_click(): print("Button clicked") app = QApplication([]) window = QWidget() layout = QVBoxLayout(window) button = QPushButton('Click me') button.clicked.connect(on_click) layout.addWidget(button) window.setLayout(layout) window.setWindowTitle("Hello PyQt") window.show() sys.exit(app.exec_()) ``` 이 예제는 한 개의 버튼을 가진 창을 열고, 버튼을 클릭하면 콘솔에 메시지를 출력한다. 이처럼 간단한 구성에서도 PyQt의 이벤트 루프와 레이아웃 관리, 위젯 연결의 기본 원리를 체감할 수 있다. --- ## 7. 모델-뷰(Model-View) 아키텍처 - Qt의 강력한 기능 중 하나로, 데이터의 모델과 표시 뷰를 분리해 복잡한 데이터 인터페이스를 구현할 수 있다. - 주요 구성요소 - 모델(Model): 데이터 저장 및 조작 로직 - 뷰(View): 데이터의 시각적 표현 - 프록시 모델: 데이터의 정렬, 필터링 등의 중간 처리 - 예시 위젯 - QListView, QTableView, QTreeView - QAbstractListModel, QAbstractTableModel 등의 추상 모델 클래스를 상속해 커스텀 모델 구현 간단한 모델-뷰 예제 - 모델 구현 시 데이터의 get/set, mime 타입 처리, 역할(role) 기반의 데이터 포맷 등을 정의 - 뷰에서 모델을 연결하고, 뷰의 시그널(예: selectionChanged)에 따라 UI를 갱신 --- ## 8. 멀티스레딩과 비동기 작업 - Qt의 멀티스레딩은 GUI가 응답성을 잃지 않도록 별도 스레드에서 작업을 수행하도록 설계된다. - 주요 구성요소 - QThread: 스레드 실행 단위 - QtConcurrent: 간단한 병렬 처리 도구 - QTimer: 일정 시간 간격으로 작업 수행 - PyQt에서의 일반적인 패턴 - Worker 객체를 별도 QThread로 이동시키고, 시그널로 결과를 메인 스레드에서 처리 - GUI 업데이트는 반드시 메인 스레드에서 수행 예제 개요 - 무거운 작업은 백그라운드에서 실행하고, 완료 시 결과를 메인 스레드로 전달해 UI를 업데이트한다. --- ## 9. UI 디자인 도구 및 파일 형식 - Qt Designer: GUI를 시각적으로 설계하고 .ui 파일로 저장 - pyuic: .ui 파일을 Python 코드로 변환하는 도구 - 예: `pyuic5 design.ui -o design_ui.py` - PyQt는 .ui 파일의 파싱 없이 직접 파이썬 코드로 UI를 구성하는 방식도 가능하나, Designer의 활용은 생산성을 높여준다. UI 디자인의 팁 - 직관적인 위젯 계층 구조와 명확한 부모-자식 관계를 유지 - 레이아웃 관리자를 통해 다양한 해상도와 창 크기에 대응 - 스타일 시트(CSS-like)로 UI 일관성 확보 --- ## 10. 디버깅, 빌드 및 배포 - 로깅: Qt의 qDebug, qWarning 등과 Python의 logging 모듈을 연계할 수 있다. - 빌드 및 배포: - PyInstaller, cx_Freeze 등을 이용해 실행 파일로 패키징 - Qt의 리소스 파일(.qrc)을 PyQt에서 리소스 시스템으로 번들링 가능 - 배포 시 주의점: - 정확한 Qt 버전과 PyQt 버전의 매칭 확인 - 필요한 Qt 라이브러리의 포함 여부 확인 --- ## 11. 참고 도구 및 학습 경로 - Qt Designer를 활용한 시각적 UI 설계 - PyQt 공식 문서 및 예제 - 관련 커뮤니티 자료 및 예제 코드 --- ## 12. 요약 - PyQt는 Python에서 Qt의 GUI 도구를 효과적으로 활용할 수 있게 해주는 강력한 바인딩이다. - 기본 구성 요소인 QApplication, QWidget/QMainWindow, 다양한 위젯, 레이아웃, 이벤트 시스템(Signal/Slot)을 이해하면 대부분의 데스크탑 UI를 구현할 수 있다. - Model-View 패턴, 멀티스레딩, UI 디자인 도구의 활용으로 확장성과 유지보수성을 높일 수 있다. --- 관련 문서: [[PyQt 개요]], [[QWidget 기초]], [[Signals and Slots (PyQt)]], [[Model-View (PyQt)]], [[Qt Designer와 UI 파일 변환(pyuic)]]