#PySide6
15 편의 글
PySide6 실전 강좌 #8 배포와 마무리 — 아이콘·버전 정보, 서명, GitHub Actions
시리즈 마지막 편으로 앱을 남에게 건넬 수 있는 상태로 마감합니다. PyInstaller spec 파일로 아이콘·이름·리소스를 관리하는 법, 버전을 한 곳에서 정의해 앱과 빌드에 공급하는 법, 서명 없는 앱이 다운로드 직후 차단되는 이유와 macOS 공증·Windows 서명의 지형, GitHub Actions 매트릭스로 3개 운영체제 빌드를 자동화하는 워크플로, 그리고 시리즈 전체의 회고까지 다룹니다.
PySide6 실전 강좌 #7 테스트 — pytest-qt와 층별 테스트 전략
GUI 앱은 테스트하기 어렵다는 통념을 층 구조로 해체합니다. Qt 없이 도는 core 테스트가 가장 많아야 하는 이유, 임시 DB 파일로 리포지토리를 검증하는 법, qtbot이 QApplication과 이벤트 루프를 대신 관리해 주는 pytest-qt의 동작 방식, 모델의 계약(rowCount·data·setData)을 검증하는 테스트, 시그널 대기(waitSignal)와 위젯 상호작용 테스트, 그리고 CI에서 화면 없이 Qt 테스트를 돌리는 방법까지 다룹니다.
PySide6 실전 강좌 #6 설정 화면 — QSettings, 다크 테마, 데이터 백업
하드코딩되어 있던 값들을 사용자에게 넘깁니다. 플랫폼별 표준 위치에 설정을 저장해 주는 QSettings의 사용법과 타입 함정, 설정 화면과 실제 동작(리마인더 시각, 닫기 버튼 동작)의 연결, 스타일시트 교체로 구현하는 다크·라이트 테마와 시스템 테마 감지, 그리고 사용자 데이터를 존중하는 마지막 조각인 CSV 내보내기와 DB 백업까지 다룹니다.
PySide6 실전 강좌 #5 트레이 상주와 리마인더 — 닫아도 죽지 않는 앱
습관 트래커를 진짜 도구로 만드는 조건, 상주를 구현합니다. QSystemTrayIcon으로 시스템 트레이에 아이콘과 메뉴를 띄우는 법, 창 닫기를 종료가 아니라 숨기기로 바꾸는 closeEvent 처리와 그 UX 논쟁, QTimer로 매일 정해진 시각에 리마인더 알림을 보내는 법, 트레이 알림의 한계와 운영체제별 차이, 그리고 앱이 두 개 떠 버리는 것을 막는 단일 인스턴스 처리까지 다룹니다.
PySide6 실전 강좌 #4 통계 화면 — QPainter로 잔디 히트맵 그리기
기성 위젯이 없는 화면을 직접 그립니다. 달성률 계산과 연속 기록 같은 통계 로직을 Qt 없는 core 층에 두고 테스트 가능하게 만드는 법, paintEvent와 QPainter로 깃허브 잔디 스타일의 히트맵 위젯을 그리는 법, 좌표 계산과 크기 대응(resizeEvent, sizeHint), 마우스 위치의 칸을 찾아 툴팁을 띄우는 히트 테스트, 그리고 다시 그리기는 update() 호출로 요청한다는 커스텀 위젯의 규칙까지 다룹니다.
PySide6 실전 강좌 #3 오늘 화면 — 커스텀 모델과 체크 토글
앱의 첫 실제 화면을 만듭니다. 리스트 위젯에 직접 아이템을 넣는 방식이 실전에서 금방 한계에 부딪히는 이유, QAbstractListModel을 상속해 리포지토리를 뷰에 연결하는 커스텀 모델, 역할(role)로 데이터의 여러 얼굴을 노출하는 법, 체크 상태 토글이 모델을 거쳐 DB까지 흐르는 경로, dataChanged 시그널로 뷰를 정확히 갱신하는 법, 습관 추가 다이얼로그까지 다룹니다.
PySide6 실전 강좌 #2 SQLite 데이터 층 — 리포지토리 패턴과 마이그레이션
앱의 기억을 담당하는 데이터 층을 만듭니다. 데스크톱 앱에 SQLite가 기본값인 이유, 운영체제마다 다른 앱 데이터 폴더를 올바르게 찾는 법, 습관과 체크 기록의 스키마 설계, SQL을 한곳에 모으는 리포지토리 패턴, 그리고 앱 업데이트 후에도 사용자 데이터가 깨지지 않게 하는 user_version 기반의 초간단 마이그레이션까지 다룹니다.
PySide6 실전 강좌 #1 프로젝트 설계 — 습관 트래커를 만들며 배우는 앱 구조
PySide6 입문을 마친 사람이 실제 앱 하나를 완성까지 끌고 가는 실전 시리즈의 첫 편입니다. 무엇을 만들지(로컬 습관 트래커)와 왜 이 소재인지, 기능 요구를 화면 단위로 쪼개는 법, UI·코어·데이터의 3층으로 코드를 나누는 구조와 그 이유, uv 기반 프로젝트 셋업, 그리고 앞으로 8편을 지탱할 메인 윈도우 뼈대까지 만듭니다.
PySide6로 데스크톱 앱 만들기 #6 스레드와 타이머 — 멈추지 않는 UI
버튼 하나에 긴 작업을 연결하면 창 전체가 응답을 멈추는 이유를 이벤트 루프 구조로 확인하고, QThread와 Worker 패턴으로 UI를 멈추지 않게 만드는 정석 코드를 완성합니다. 주기 작업을 처리하는 QTimer까지 다룹니다.
PySide6로 데스크톱 앱 만들기 #5 모델과 뷰 — 리스트·테이블에 데이터 연결
위젯에 데이터를 직접 넣는 방식의 한계를 짚고, Qt의 모델/뷰 구조로 넘어갑니다. QAbstractTableModel 상속 구현, 데이터 변경 통지, QSortFilterProxyModel 검색 필터, 선택 처리까지 할 일 테이블로 실습합니다.
PySide6로 데스크톱 앱 만들기 #4 Qt Designer와 UI 파일 — 화면을 그려서 불러오기
PySide6에 포함된 Qt Designer로 화면을 그리고, .ui 파일을 pyside6-uic와 QUiLoader 두 방식으로 불러오는 법을 정리합니다. 코드와 화면을 분리하는 워크플로를 할 일 앱 폼으로 실습합니다.