PyQt 애플리케이션에서 현대적인 네비게이션 인터페이스 구축 방법
PyQt-Fluent-Widgets의 네비게이션 컴포넌트를 활용한 전면 디자인 기반 UI 구현 가이드
PyQt 기반 데스크탑 애플리케이션 개발 시 사용자 경험을 극대화하는 네비게이션 시스템 설계에 어려움을 겪고 있다면, PyQt-Fluent-Widgets의 NavigationInterface 컴포넌트가 최적의 해결책입니다. 이 라이브러리는 Fluent Design 스타일의 네비게이션 인터페이스를 손쉽게 구현할 수 있는 완전한 기능 집합체입니다.
네비게이션 컴포넌트 선택 이유
데스크탑 애플리케이션에서 핵심적인 역할을 수행하는 네비게이션 시스템은 다음과 같은 특성을 갖춰야 합니다:
- 동적 레이아웃 지원: 창 크기 변화에 따른 모드 자동 조정
- 직관적인 상호작용: 계층 구조와 부드러운 애니메이션 효과
- 고도의 커스터마이징: 항목 및 스타일 맞춤 설정 가능
- 확장성: 새로운 기능 모듈 추가 용이
핵심 아키텍처 이해
이 라이브러리의 네비게이션 시스템은 세 가지 주요 구성 요소로 구성되어 있습니다:
- NavigationInterface: 전체 네비게이션 로직 관리
- NavigationPanel: 항목 배치 및 상호작용 처리
- NavigationWidget: 항목 확장 기반 클래스
네 가지 표시 모드
NavigationInterface는 창 크기에 따라 자동으로 변경되는 네 가지 표시 모드를 제공합니다:
- 확장 모드: 넓은 화면에서 전체 아이콘 및 텍스트 표시
- 단순 모드: 중간 크기 창에서 아이콘만 표시
- 메뉴 모드: 좁은 창에서 팝업 형식으로 표시
- 최소화 모드: 최소 창에서 메뉴 버튼만 표시
실습 예제: 기본 네비게이션 인터페이스 구축
from PyQt5.QtWidgets import QApplication, QMainWindow, QStackedWidget
from qfluentwidgets import NavigationInterface, NavigationItemPosition
class AppWindow(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.container = QWidget()
self.hBoxLayout = QHBoxLayout(self.container)
self.stackWidget = QStackedWidget()
self.navigation = NavigationInterface(self, showMenuButton=True)
self.add_nav_item("home", "홈", FIF.HOME)
self.add_nav_item("search", "검색", FIF.SEARCH)
self.add_nav_item("settings", "설정", FIF.SETTING, position=NavigationItemPosition.BOTTOM)
self.hBoxLayout.addWidget(self.navigation)
self.hBoxLayout.addWidget(self.stackWidget)
self.setCentralWidget(self.container)
def add_nav_item(self, route_key, text, icon, position=NavigationItemPosition.TOP):
page = QWidget()
self.stackWidget.addWidget(page)
self.navigation.addItem(
routeKey=route_key,
icon=icon,
text=text,
onClick=lambda: self.stackWidget.setCurrentWidget(page),
position=position
)
고급 기능: 커스텀 항목 및 로직 구현
사용자 정의 항목 생성 예시:
class CustomNavWidget(NavigationWidget):
def __init__(self, parent=None):
super().__init__(isSelectable=False, parent=parent)
self.avatar = QImage('profile.jpg').scaled(24, 24)
def paintEvent(self, e):
painter = QPainter(self)
# 커스텀 그림 그리기 로직
다중 레벨 메뉴 구현:
parent_item = navigation.addItem("view", FIF.VIEW, "보기")
navigation.addItem("view.list", FIF.LIST, "리스트 보기", parentRouteKey="view")
응답형 디자인 적용
레이아웃 동적 조정:
navigation.setExpandWidth(300)
navigation.setMinimumExpandWidth(800)
navigation.toggle()
navigation.setCollapsible(True)
실무 팁: 복잡한 네비게이션 시스템 구축
- 항목 분류: 관련 기능을 그룹화하여 구분
- 스크롤 영역: 항목이 많을 경우 SCROLL 위치 사용
- 히스토리 관리: qrouter 모듈 활용
문제 해결 가이드
- 스타일 미적용: 스타일시트 재설정 및 update() 호출
- 헤더 오버랩: resizeEvent에서 위치 조정
- 아크릴 효과 없음: setAcrylicEnabled(True) 활성화
추천 자료
- 공식 문서: docs/source/navigation.md
- 샘플 코드: examples/navigation/
- 소스코드 분석: qfluentwidgets/components/navigation/