Ch. 6. PySide6

0. PySide6 학습 예제 전체 흐름
PySide6 학습 예제는 창 만들기 → 위젯 배치 → 이벤트 처리 → 데이터 표시 → 화면 전환 → 프로젝트 구조화 순서로 구성하면 좋습니다.
처음에는 기본 창과 위젯을 만드는 방법을 익히고, 이후 레이아웃, Signal / Slot, 입력값 처리, 파일 저장, Qt Designer, 스레드, 미니 프로젝트 순서로 확장합니다.
전체 학습 흐름
기본 창 만들기 → 기본 위젯 사용 → 레이아웃 구성 → Signal / Slot 이벤트 처리 → 입력값 처리 → 데이터 표시 → Qt Designer → 파일 저장 / 불러오기 → 타이머 / 스레드 → 미니 프로젝트
1. 기본 창과 위젯 만들기
가장 먼저 PySide6 프로그램의 기본 구조를 이해하고, 화면에 위젯을 표시하는 방법을 학습합니다.
| 번호 | 학습 주제 | 예제 방향 |
| 1.1 | 기본 창 띄우기 | QWidget으로 빈 창 만들기 |
| 1.2 | 창 제목과 크기 설정 | setWindowTitle(), resize() |
| 1.3 | QLabel 사용 | 화면에 텍스트 표시 |
| 1.4 | QPushButton 사용 | 버튼 생성과 화면 표시 |
| 1.5 | QLineEdit 사용 | 사용자 입력 받기 |
| 1.6 | QTextEdit 사용 | 여러 줄 텍스트 입력 |
| 1.7 | QCheckBox 사용 | 체크 여부 확인 |
| 1.8 | QRadioButton 사용 | 여러 선택지 중 하나 선택 |
| 1.9 | QComboBox 사용 | 드롭다운 선택 |
| 1.10 | QSlider 사용 | 숫자 값 조절 |
2. 레이아웃 구조 이해
위젯을 화면에 배치할 때 좌표를 직접 지정하지 않고, 레이아웃을 사용하여 구조적으로 배치하는 방법을 학습합니다.
| 번호 | 학습 주제 | 예제 방향 |
| 2.1 | 레이아웃이 필요한 이유 | 위젯을 직접 좌표로 배치하지 않는 이유 |
| 2.2 | QVBoxLayout | 위젯을 세로로 배치 |
| 2.3 | QHBoxLayout | 위젯을 가로로 배치 |
| 2.4 | QGridLayout | 표 형태로 위젯 배치 |
| 2.5 | QFormLayout | 입력 폼 형태 배치 |
| 2.6 | 중첩 레이아웃 | 세로 / 가로 레이아웃 조합 |
| 2.7 | stretch와 spacing | 여백과 비율 조정 |
| 2.8 | 실습: 로그인 화면 만들기 | ID, PW, 로그인 버튼 배치 |
3. Signal / Slot 구조 이해
PySide6 GUI 프로그램의 핵심인 이벤트 처리 구조를 학습합니다. 버튼 클릭, 슬라이더 값 변경, 사용자 정의 Signal, 다중 Signal / Slot 구조를 단계적으로 다룹니다.
| 번호 | 학습 주제 | 예제 방향 |
| 3.1 | Signal / Slot 구조 이해하기 (1) | 버튼 클릭 → 함수 실행 |
| 3.2 | Signal / Slot 구조 이해하기 (2) | 버튼 클릭 시 bool 값 전달 |
| 3.3 | QSlider 값 전달 | valueChanged(int) Signal 이해 |
| 3.4 | 사용자 정의 Signal 구현 | Signal(int), emit() 사용 |
| 3.5 | 단일 Signal / 다중 Slot | 하나의 Signal이 여러 함수 실행 |
| 3.6 | 다중 Signal / 단일 Slot | 여러 위젯 Signal을 하나의 함수에서 처리 |
| 3.7 | Signal 연결 해제 | disconnect() 사용 |
| 3.8 | lambda를 이용한 값 전달 | 버튼마다 다른 값 전달 |
| 3.9 | partial을 이용한 값 전달 | 여러 버튼을 하나의 Slot에 연결 |
| 3.10 | 실습: 계산기 버튼 이벤트 처리 | 숫자 버튼과 연산 버튼 연결 |
4. 입력 위젯과 데이터 처리
사용자로부터 값을 입력받고, 입력값을 검증하거나 계산하여 결과를 화면에 표시하는 방법을 학습합니다.
| 번호 | 학습 주제 | 예제 방향 |
| 4.1 | QLineEdit 입력값 가져오기 | text() 사용 |
| 4.2 | 입력값 검증 | 빈 값 체크, 숫자 변환 |
| 4.3 | QLabel에 결과 출력 | 입력 → 버튼 클릭 → 결과 표시 |
| 4.4 | QSpinBox 사용 | 정수 입력 |
| 4.5 | QDoubleSpinBox 사용 | 실수 입력 |
| 4.6 | QDateEdit 사용 | 날짜 입력 |
| 4.7 | QTimeEdit 사용 | 시간 입력 |
| 4.8 | 실습: BMI 계산기 | 키 / 몸무게 입력 후 결과 표시 |
| 4.9 | 실습: 단위 변환기 | cm ↔ inch, kg ↔ lb 변환 |
5. 표시 위젯과 상태 표현
사용자에게 텍스트, 숫자, 이미지, 진행률, 상태 메시지를 보여주는 위젯을 학습합니다.
| 번호 | 학습 주제 | 예제 방향 |
| 5.1 | QLabel 스타일 변경 | 글자 크기, 색상 변경 |
| 5.2 | QProgressBar 사용 | 진행률 표시 |
| 5.3 | QLCDNumber 사용 | 숫자 표시 |
| 5.4 | QPixmap 이미지 표시 | 이미지 파일 보여주기 |
| 5.5 | QStatusBar 사용 | 상태 메시지 표시 |
| 5.6 | 실습: 다운로드 진행률 화면 | 버튼 클릭 → ProgressBar 증가 |
| 5.7 | 실습: 슬라이더 값 시각화 | Slider → ProgressBar, LCDNumber 연동 |
6. 컨테이너 위젯과 화면 구성
여러 위젯을 묶거나, 탭과 화면 전환 구조를 사용하여 복잡한 GUI 화면을 구성하는 방법을 학습합니다.
| 번호 | 학습 주제 | 예제 방향 |
| 6.1 | QGroupBox | 관련 위젯 묶기 |
| 6.2 | QTabWidget | 탭 화면 구성 |
| 6.3 | QStackedWidget | 여러 화면 전환 |
| 6.4 | QScrollArea | 스크롤 가능한 화면 |
| 6.5 | QSplitter | 화면 영역 크기 조절 |
| 6.6 | 실습: 설정 화면 만들기 | 기본 설정 / 고급 설정 탭 구성 |
| 6.7 | 실습: 메뉴형 화면 전환 | 왼쪽 메뉴 → 오른쪽 화면 변경 |
7. 메뉴, 툴바, 액션
QMainWindow 구조를 기반으로 메뉴바, 툴바, 상태바를 구성하는 방법을 학습합니다.
| 번호 | 학습 주제 | 예제 방향 |
| 7.1 | QMainWindow 구조 | 메뉴바, 툴바, 상태바 이해 |
| 7.2 | 메뉴바 만들기 | File, Edit 메뉴 구성 |
| 7.3 | QAction 사용 | 메뉴 클릭 이벤트 처리 |
| 7.4 | 툴바 만들기 | 자주 쓰는 기능 버튼 배치 |
| 7.5 | 상태바 메시지 출력 | 하단 상태 메시지 표시 |
| 7.6 | 실습: 메모장 기본 구조 | 새 파일, 열기, 저장 메뉴 만들기 |
8. Dialog와 메시지 창
사용자에게 알림을 보여주거나, 파일 선택, 색상 선택, 글꼴 선택 같은 보조 창을 사용하는 방법을 학습합니다.
| 번호 | 학습 주제 | 예제 방향 |
| 8.1 | QMessageBox | 알림, 경고, 확인 창 |
| 8.2 | QFileDialog | 파일 열기, 저장하기 |
| 8.3 | QColorDialog | 색상 선택 |
| 8.4 | QFontDialog | 글꼴 선택 |
| 8.5 | QInputDialog | 간단한 입력 창 |
| 8.6 | 사용자 정의 Dialog | 직접 Dialog 클래스 만들기 |
| 8.7 | 실습: 텍스트 파일 열기 | 파일 선택 → 내용 표시 |
| 8.8 | 실습: 설정 Dialog 만들기 | 이름, 색상, 폰트 설정 |
9. 리스트, 테이블, 데이터 표시
목록, 표, 계층형 데이터를 화면에 표시하고 사용자가 선택한 데이터를 처리하는 방법을 학습합니다.
| 번호 | 학습 주제 | 예제 방향 |
| 9.1 | QListWidget | 목록 데이터 표시 |
| 9.2 | QListWidgetItem | 항목 추가 / 삭제 |
| 9.3 | QTableWidget | 표 형태 데이터 표시 |
| 9.4 | 테이블 행 추가 / 삭제 | 버튼으로 데이터 조작 |
| 9.5 | 셀 값 읽기 | 선택한 셀 데이터 가져오기 |
| 9.6 | QTreeWidget | 계층 구조 데이터 표시 |
| 9.7 | 실습: 할 일 목록 앱 | 입력 → 목록 추가 → 삭제 |
| 9.8 | 실습: 학생 점수표 | 이름, 점수 입력 후 테이블 표시 |
10. Model / View 구조
데이터와 화면을 분리하는 Model / View 구조를 이해하고, 더 큰 규모의 데이터 표시 방식을 학습합니다.
| 번호 | 학습 주제 | 예제 방향 |
| 10.1 | Model/View 개념 | 데이터와 화면 분리 이해 |
| 10.2 | QStringListModel | 문자열 목록 모델 |
| 10.3 | QListView | Model 기반 목록 표시 |
| 10.4 | QTableView | Model 기반 테이블 표시 |
| 10.5 | QStandardItemModel | 일반 데이터 모델 |
| 10.6 | 실습: 상품 목록 뷰어 | Model/View로 상품 목록 표시 |
| 10.7 | 실습: 검색 가능한 리스트 | 입력값으로 목록 필터링 |
11. 파일 입출력과 데이터 저장
파일을 열고 저장하며, CSV와 JSON 데이터를 GUI 프로그램에서 사용하는 방법을 학습합니다.
| 번호 | 학습 주제 | 예제 방향 |
| 11.1 | 텍스트 파일 읽기 | 파일 내용 QTextEdit에 표시 |
| 11.2 | 텍스트 파일 저장 | QTextEdit 내용 저장 |
| 11.3 | CSV 파일 읽기 | CSV 데이터를 테이블에 표시 |
| 11.4 | JSON 파일 읽기 | 설정값 불러오기 |
| 11.5 | JSON 파일 저장 | 사용자 설정 저장 |
| 11.6 | 실습: 간단 메모장 | 열기, 저장 기능 구현 |
| 11.7 | 실습: 설정 저장 앱 | 창 크기, 사용자 이름 저장 |
12. 스타일과 화면 꾸미기
setStyleSheet()를 사용하여 위젯의 색상, 크기, 테두리, 배경 등을 꾸미는 방법을 학습합니다.
| 번호 | 학습 주제 | 예제 방향 |
| 12.1 | setStyleSheet() 기본 | CSS와 비슷한 스타일 적용 |
| 12.2 | 버튼 스타일 변경 | 배경색, 글자색, 테두리 |
| 12.3 | QLabel 스타일 변경 | 글자 크기, 색상, 정렬 |
| 12.4 | 입력창 스타일 변경 | 포커스 효과 |
| 12.5 | 전체 앱 스타일 적용 | 공통 스타일 관리 |
| 12.6 | 다크 모드 흉내내기 | 어두운 배경 UI |
| 12.7 | 실습: 로그인 화면 꾸미기 | 기본 UI를 보기 좋게 디자인 |
13. Qt Designer 활용
Qt Designer로 화면을 시각적으로 구성하고, .ui 파일을 Python 코드와 연결하는 방법을 학습합니다.
| 번호 | 학습 주제 | 예제 방향 |
| 13.1 | Qt Designer 역할 이해 | UI를 시각적으로 만드는 도구 |
| 13.2 | form.ui 파일 만들기 | Designer에서 화면 저장 |
| 13.3 | pyside6-uic 사용 | .ui → .py 변환 |
| 13.4 | ui_form.py 적용 | Python 코드에서 UI 클래스 사용 |
| 13.5 | self.ui 구조 이해 | Designer 위젯 접근 방식 |
| 13.6 | objectName 이해 | 코드에서 위젯을 찾는 이름 |
| 13.7 | Designer + Signal/Slot 연결 | 버튼 클릭, 슬라이더 이동 처리 |
| 13.8 | 실습: Designer로 계산기 UI 만들기 | UI와 로직 분리 |
14. 타이머와 시간 처리
QTimer를 사용하여 일정 시간마다 함수를 실행하고, 시계, 카운트다운, 스톱워치 등을 구현하는 방법을 학습합니다.
| 번호 | 학습 주제 | 예제 방향 |
| 14.1 | QTimer 기본 | 일정 시간마다 함수 실행 |
| 14.2 | 디지털 시계 만들기 | 현재 시간 표시 |
| 14.3 | 타이머 시작 / 정지 | 버튼으로 타이머 제어 |
| 14.4 | 카운트다운 만들기 | 남은 시간 감소 |
| 14.5 | ProgressBar 자동 증가 | 타이머와 진행률 연결 |
| 14.6 | 실습: 스톱워치 | 시작, 정지, 초기화 |
15. 스레드와 오래 걸리는 작업
오래 걸리는 작업으로 GUI가 멈추는 문제를 이해하고, QThread와 Worker 구조로 작업을 분리하는 방법을 학습합니다.
| 번호 | 학습 주제 | 예제 방향 |
| 15.1 | GUI 멈춤 현상 이해 | 오래 걸리는 작업이 화면을 멈추는 이유 |
| 15.2 | QThread 개념 | 작업 스레드 분리 |
| 15.3 | Worker 객체 구조 | 작업 로직 분리 |
| 15.4 | 스레드 Signal / Slot | 작업 결과를 GUI에 전달 |
| 15.5 | ProgressBar와 스레드 | 진행률 업데이트 |
| 15.6 | 실습: 긴 작업 실행 앱 | 버튼 클릭 → 작업 진행률 표시 |
| 15.7 | 실습: 파일 처리 진행률 | 파일 읽기 작업을 스레드로 처리 |
16. 프로젝트 구조화
한 파일에 모든 코드를 작성하는 방식에서 벗어나, 실행 코드, 화면 코드, 리소스, 설정 파일 등을 분리하는 방법을 학습합니다.
| 번호 | 학습 주제 | 예제 방향 |
| 16.1 | 한 파일 예제의 한계 | 코드가 길어질 때 문제점 |
| 16.2 | main.py 분리 | 실행 코드 분리 |
| 16.3 | widget.py 분리 | 화면 클래스 분리 |
| 16.4 | ui 파일 분리 | Designer UI 관리 |
| 16.5 | resources 폴더 | 이미지, 아이콘 관리 |
| 16.6 | config 파일 | 설정값 관리 |
| 16.7 | MVC/MVVM 기초 | 화면, 로직, 데이터 분리 |
| 16.8 | 실습: 구조화된 메모장 프로젝트 | 파일별 역할 분리 |
17. 미니 프로젝트 예제
앞에서 배운 위젯, 레이아웃, Signal / Slot, 파일 입출력, 스레드 등을 활용하여 작은 프로젝트를 구현합니다.
| 번호 | 프로젝트 | 포함 학습 요소 |
| 17.1 | 버튼 클릭 카운터 | QPushButton, QLabel, Signal / Slot |
| 17.2 | 로그인 화면 | QLineEdit, QPushButton, 입력 검증 |
| 17.3 | BMI 계산기 | 입력값 처리, 결과 출력 |
| 17.4 | 할 일 목록 앱 | QListWidget, 추가 / 삭제 |
| 17.5 | 메모장 앱 | QTextEdit, QFileDialog |
| 17.6 | 이미지 뷰어 | QLabel, QPixmap, QFileDialog |
| 17.7 | 슬라이더 대시보드 | QSlider, QProgressBar, QLCDNumber |
| 17.8 | 설정 저장 앱 | JSON 저장 / 불러오기 |
| 17.9 | 학생 점수 관리 앱 | QTableWidget, 데이터 입력 |
| 17.10 | 간단 계산기 | 버튼 이벤트, 상태 관리 |
| 17.11 | 타이머 앱 | QTimer, 버튼 제어 |
| 17.12 | 파일 처리 진행률 앱 | QThread, Signal / Slot, ProgressBar |
18. 추천 학습 순서
PySide6를 처음 학습하는 경우, 아래 순서로 진행하면 기본 개념부터 실전 프로젝트까지 자연스럽게 확장할 수 있습니다.
1. 기본 창 만들기
↓
2. 기본 위젯 사용
↓
3. 레이아웃 구성
↓
4. Signal / Slot 이벤트 처리
↓
5. 입력값 처리
↓
6. 리스트 / 테이블 데이터 표시
↓
7. Qt Designer 사용
↓
8. 파일 저장 / 불러오기
↓
9. 타이머 / 스레드
↓
10. 미니 프로젝트
정리
Signal / Slot 시리즈는 PySide6 학습자료 중에서 가장 중요한 중간 단계입니다.
버튼, 슬라이더, 다이얼, 사용자 정의 Signal까지 학습한 뒤에는 입력 위젯, 레이아웃, Qt Designer, 미니 프로젝트 순서로 확장하면 좋습니다.