PyQt 애플리케이션에서 현대적인 네비게이션 인터페이스 구축 방법

PyQt 애플리케이션에서 현대적인 네비게이션 인터페이스 구축 방법

PyQt-Fluent-Widgets의 네비게이션 컴포넌트를 활용한 전면 디자인 기반 UI 구현 가이드

PyQt-Fluent-Widgets 프로젝트 주소

PyQt 기반 데스크탑 애플리케이션 개발 시 사용자 경험을 극대화하는 네비게이션 시스템 설계에 어려움을 겪고 있다면, PyQt-Fluent-Widgets의 NavigationInterface 컴포넌트가 최적의 해결책입니다. 이 라이브러리는 Fluent Design 스타일의 네비게이션 인터페이스를 손쉽게 구현할 수 있는 완전한 기능 집합체입니다.

네비게이션 컴포넌트 선택 이유

데스크탑 애플리케이션에서 핵심적인 역할을 수행하는 네비게이션 시스템은 다음과 같은 특성을 갖춰야 합니다:

  • 동적 레이아웃 지원: 창 크기 변화에 따른 모드 자동 조정
  • 직관적인 상호작용: 계층 구조와 부드러운 애니메이션 효과
  • 고도의 커스터마이징: 항목 및 스타일 맞춤 설정 가능
  • 확장성: 새로운 기능 모듈 추가 용이

핵심 아키텍처 이해

이 라이브러리의 네비게이션 시스템은 세 가지 주요 구성 요소로 구성되어 있습니다:

  1. NavigationInterface: 전체 네비게이션 로직 관리
  2. NavigationPanel: 항목 배치 및 상호작용 처리
  3. NavigationWidget: 항목 확장 기반 클래스

네 가지 표시 모드

NavigationInterface는 창 크기에 따라 자동으로 변경되는 네 가지 표시 모드를 제공합니다:

  1. 확장 모드: 넓은 화면에서 전체 아이콘 및 텍스트 표시
  2. 단순 모드: 중간 크기 창에서 아이콘만 표시
  3. 메뉴 모드: 좁은 창에서 팝업 형식으로 표시
  4. 최소화 모드: 최소 창에서 메뉴 버튼만 표시

실습 예제: 기본 네비게이션 인터페이스 구축


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)

실무 팁: 복잡한 네비게이션 시스템 구축

  1. 항목 분류: 관련 기능을 그룹화하여 구분
  2. 스크롤 영역: 항목이 많을 경우 SCROLL 위치 사용
  3. 히스토리 관리: qrouter 모듈 활용

문제 해결 가이드

  • 스타일 미적용: 스타일시트 재설정 및 update() 호출
  • 헤더 오버랩: resizeEvent에서 위치 조정
  • 아크릴 효과 없음: setAcrylicEnabled(True) 활성화

추천 자료

  • 공식 문서: docs/source/navigation.md
  • 샘플 코드: examples/navigation/
  • 소스코드 분석: qfluentwidgets/components/navigation/

태그: pyqt fluentdesign Navigation UI widget

6월 19일 19:08에 게시됨