QML
← 전체 컴포넌트

Nav

앱의 화면이나 섹션을 이동하는 세로 내비게이션입니다. 항목을 그룹으로 묶거나 하위 목록으로 펼칠 수 있습니다.

import Syidax.Core.Nav

지원 QML 타입

타입정의 / 역할
앱이 화면을 전환할 수 있도록 선택 값을 전달하는 세로 탐색 메뉴입니다.
자신의 값이 활성 상태일 때 강조되는 개별 탐색 항목입니다.
하위 탐색 항목을 접고 펼치는 가지 항목입니다.
탐색 항목들을 제목 아래에 묶는 섹션입니다.

예제로 보기

미리보기는 Qt 실행 화면의 이미지입니다. 아래 버튼으로 결과를 전환하세요.

01 기본 구성

SyNav는 세로 내비게이션 목록입니다: SyNavItem 행, 셰브론이 달린 제목 아래로 행들을 한 단계 깊이 접는 SyNavSub 가지, 같은 깊이의 행들 위에 제목을 두는 SyNavGroup 구역.

Qt 실행 화면 · 이미지
기본 구성 · 기본
기본 실행 화면
QML 코드
import QtQuick
import Syidax.Core

Item {
    component EventLog: Rectangle {
        id: logBox
        property var lines: []
        implicitWidth: 440
        implicitHeight: Math.max(56, logText.implicitHeight + 24)
        radius: 4; color: Theme.semantic.backgroundBold
        function log(value) { lines = lines.slice(-3).concat([String(value)]) }
        Text {
            id: logText; x: 12; y: 12; width: parent.width - 24
            text: logBox.lines.length ? logBox.lines.join("\n") : "컨트롤을 조작하면 이벤트 결과가 표시됩니다."
            wrapMode: Text.Wrap; color: Theme.semantic.textDefault
            font.family: Theme.monoFontFamily; font.pixelSize: 12
        }
    }

    implicitWidth: Math.max(360, childrenRect.width)
    implicitHeight: childrenRect.height

    property QtObject settings: QtObject {
        id: storyArgs
        property string activeValue: "home"
        property bool disabled: false
    }

    readonly property string members: [
        "SyNavItem { text: " + JSON.stringify("홈") + "; value: \"home\" }",
        "SyNavSub {",
        "    title: " + JSON.stringify("프로젝트") + "; value: \"projects\"; open: true",
        "    SyNavItem { text: " + JSON.stringify("진행 중") + "; value: \"active\" }",
        "    SyNavItem { text: " + JSON.stringify("보관됨") + "; value: \"archived\" }",
        "}",
        "SyNavGroup {",
        "    title: " + JSON.stringify("계정"),
        "    SyNavItem { text: " + JSON.stringify("프로필") + "; value: \"profile\" }",
        "    SyNavItem { text: " + JSON.stringify("결제") + "; value: \"billing\"; disabled: true }",
        "}"
    ].join("\n")

    Column {
        spacing: 12
        SyNav {
            disabled: storyArgs.disabled
            onSelected: (value) => output.log(value)
            Binding on activeValue { value: storyArgs.activeValue }
            SyNavItem { text: "홈"; value: "home" }
            SyNavSub {
                title: "프로젝트"; value: "projects"; open: true
                SyNavItem { text: "진행 중"; value: "active" }
                SyNavItem { text: "보관됨"; value: "archived" }
            }
            SyNavGroup {
                title: "계정"
                SyNavItem { text: "프로필"; value: "profile" }
                SyNavItem { text: "결제"; value: "billing"; disabled: true }
            }
        }
        EventLog { id: output }
    }

}

02 SyNavSub

SyNavSub는 펼치고 접는 분기입니다.

Qt 실행 화면 · 이미지
SyNavSub · 기본
QML 코드
import QtQuick
import Syidax.Core

Item {
    implicitWidth: Math.max(360, childrenRect.width)
    implicitHeight: childrenRect.height
    property QtObject settings: QtObject {
        id: storyArgs
        property string title: "프로젝트"
        property bool open: true
    }

    
    SyNav {
        width: 240
        SyNavSub {
            title: storyArgs.title
            Binding on open { value: storyArgs.open }
            SyNavItem { text: "진행 중"; value: "active" }
            SyNavItem { text: "보관됨"; value: "archived" }
        }
    }
}

03 SyNavGroup

SyNavGroup은 추가 들여쓰기나 접기 동작 없이 구역의 제목을 표시합니다.

Qt 실행 화면 · 이미지
SyNavGroup · 기본
기본 실행 화면
QML 코드
import QtQuick
import Syidax.Core

Item {
    implicitWidth: Math.max(360, childrenRect.width)
    implicitHeight: childrenRect.height
    property QtObject settings: QtObject {
        id: storyArgs
        property string title: "계정"
    }

    
    SyNav {
        width: 240
        SyNavGroup {
            title: storyArgs.title
            SyNavItem { text: "프로필"; value: "profile" }
            SyNavItem { text: "설정"; value: "settings" }
        }
    }
}

04 selected

SyNav의 시그널은 selected(value: string) 하나이며 두 상황에서 발생합니다:

Qt 실행 화면 · 이미지
selected · 기본
기본 실행 화면
QML 코드
import QtQuick
import Syidax.Core

Item {
    component EventLog: Rectangle {
        id: logBox
        property var lines: []
        implicitWidth: 440
        implicitHeight: Math.max(56, logText.implicitHeight + 24)
        radius: 4; color: Theme.semantic.backgroundBold
        function log(value) { lines = lines.slice(-3).concat([String(value)]) }
        Text {
            id: logText; x: 12; y: 12; width: parent.width - 24
            text: logBox.lines.length ? logBox.lines.join("\n") : "컨트롤을 조작하면 이벤트 결과가 표시됩니다."
            wrapMode: Text.Wrap; color: Theme.semantic.textDefault
            font.family: Theme.monoFontFamily; font.pixelSize: 12
        }
    }

    implicitWidth: Math.max(360, childrenRect.width)
    implicitHeight: childrenRect.height

    

    Column {
        spacing: 12
        SyNav {
            width: 240
            onSelected: (value) => output.log(("selected: %1").arg(value))
            SyNavItem { text: "홈"; value: "home" }
            SyNavSub {
                title: "프로젝트"; value: "projects"
                SyNavItem { text: "진행 중"; value: "active" }
            }
        }
        EventLog { id: output }
    }
}

05 setActive · setOpen · setClose · setTrigger

SyNav.setActive(value)는 activeValue를 설정하여 value가 일치하는 행을 활성 행으로 만듭니다(어떤 행과도 일치하지 않는 값이면 모든 행이 비활성).

Qt 실행 화면 · 이미지
setActive · setOpen · setClose · setTrigger · 기본
QML 코드
import QtQuick
import Syidax.Core

Item {
    implicitWidth: Math.max(360, childrenRect.width)
    implicitHeight: childrenRect.height
    // Focused Gallery routes: keep only the selected API and its prerequisites.
    id: featureStory

    Column {
        spacing: 24
        SyNav {
            id: nav
            width: 240
            SyNavItem { text: "홈"; value: "home" }
            SyNavSub { id: projects; title: "프로젝트"; value: "projects"; SyNavItem { text: "진행 중"; value: "active" } }
            SyNavItem { text: "프로필"; value: "profile" }
        }
        Flow {
            width: 460
            spacing: 8
            SyButton { id: exampleControl1;  visible: true; text: "nav.setActive(\"profile\")"; variant: "secondary"; size: "small"; onClicked: nav.setActive("profile") }
            SyButton { id: exampleControl2;  visible: true; text: "projects.setOpen()"; variant: "secondary"; size: "small"; onClicked: projects.setOpen() }
            SyButton { id: exampleControl3;  visible: true; text: "projects.setClose()"; variant: "secondary"; size: "small"; onClicked: projects.setClose() }
            SyButton { visible: true; text: "projects.setTrigger()"; variant: "secondary"; size: "small"; onClicked: projects.setTrigger() }
        }
        Text {
            text: "nav.activeValue === " + JSON.stringify(nav.activeValue) + "   projects.open === " + projects.open
            font.family: Theme.monoFontFamily
            font.pixelSize: 12
            color: Theme.semantic.textSubtle
        }
    }
}

06 현재 경로 선택

activeValue 설정을 적용한 현재 경로 선택 예제입니다.

Qt 실행 화면 · 이미지
현재 경로 선택 · 실행 결과
기본 실행 화면
QML 코드
import QtQuick
import Syidax.Core

Item {
    component EventLog: Rectangle {
        id: logBox
        property var lines: []
        implicitWidth: 440
        implicitHeight: Math.max(56, logText.implicitHeight + 24)
        radius: 4; color: Theme.semantic.backgroundBold
        function log(value) { lines = lines.slice(-3).concat([String(value)]) }
        Text {
            id: logText; x: 12; y: 12; width: parent.width - 24
            text: logBox.lines.length ? logBox.lines.join("\n") : "컨트롤을 조작하면 이벤트 결과가 표시됩니다."
            wrapMode: Text.Wrap; color: Theme.semantic.textDefault
            font.family: Theme.monoFontFamily; font.pixelSize: 12
        }
    }

    implicitWidth: Math.max(360, childrenRect.width)
    implicitHeight: childrenRect.height

    property QtObject settings: QtObject {
        id: storyArgs
        property string activeValue: "settings"
        property bool disabled: false
    }

    readonly property string members: [
        "SyNavItem { text: " + JSON.stringify("홈") + "; value: \"home\" }",
        "SyNavSub {",
        "    title: " + JSON.stringify("프로젝트") + "; value: \"projects\"; open: true",
        "    SyNavItem { text: " + JSON.stringify("진행 중") + "; value: \"active\" }",
        "    SyNavItem { text: " + JSON.stringify("보관됨") + "; value: \"archived\" }",
        "}",
        "SyNavGroup {",
        "    title: " + JSON.stringify("계정"),
        "    SyNavItem { text: " + JSON.stringify("프로필") + "; value: \"profile\" }",
        "    SyNavItem { text: " + JSON.stringify("결제") + "; value: \"billing\"; disabled: true }",
        "}"
    ].join("\n")

    Column {
        spacing: 12
        SyNav {
            disabled: storyArgs.disabled
            onSelected: (value) => output.log(value)
            Binding on activeValue { value: storyArgs.activeValue }
            SyNavItem { text: "홈"; value: "home" }
            SyNavSub {
                title: "프로젝트"; value: "projects"; open: true
                SyNavItem { text: "진행 중"; value: "active" }
                SyNavItem { text: "보관됨"; value: "archived" }
            }
            SyNavGroup {
                title: "계정"
                SyNavItem { text: "프로필"; value: "profile" }
                SyNavItem { text: "결제"; value: "billing"; disabled: true }
            }
        }
        EventLog { id: output }
    }

}

API 54

항목을 가리키거나 선택하면 QML 예제와 복사 버튼이 나타납니다.

속성 · SyNav

속성타입기본값설명
list (기본 속성)—안에 선언한 항목: SyNavItem, SyNavSub, SyNavGroup, 순서대로
string""활성 행의 value. 경로를 따르려면 설정; 클릭도 설정함
boolfalse모든 행과 가지 헤더 멈춤
var[]중첩된 것까지 모든 SyNavItem과 SyNavSub를 순서대로(그룹 제외); 내비가 유지

속성 · SyNavItem

속성타입기본값설명
list (기본 속성)—글자 뒤에 놓이는 아이템(아이콘, 배지)
string""행 라벨(비어 있으면 숨김)
string""클릭이 보고하는 값이자 activeValue와 비교되는 값; 빈 값은 절대 활성 아님
boolfalse회색, 클릭과 키 무시
int0중첩 단계 — 내비가 설정; 단계마다 20 px 들여쓰기
bool (읽기 전용)—activeValue가 이 행의 비어 있지 않은 value와 같음
bool (읽기 전용)—행 또는 내비의 disabled
bool (읽기 전용)—포인터가 행 위에 있음
bool (읽기 전용)—키보드 포커스
varnull소유하는 SyNav(내비가 설정)

속성 · SyNavSub

속성타입기본값설명
list (기본 속성)—한 단계 깊은 행(그룹이나 가지도 가능)
string""헤더 글자
string""가지가 열리거나 닫힐 때 selected로 보고되는 값
boolfalse가지 상태; 설정하면 조용히 열리거나 닫히고, 읽어서 알 수 있음
boolfalse헤더 멈춤; 안의 행은 자기 상태 유지
int0중첩 단계 — 내비가 설정
bool (읽기 전용)—가지 또는 내비의 disabled
bool (읽기 전용)—포인터가 헤더 위에 있음
bool (읽기 전용)—헤더에 키보드 포커스
varnull소유하는 SyNav(내비가 설정)

속성 · SyNavGroup

속성타입기본값설명
list (기본 속성)—제목 아래의 행, 같은 깊이
string""구역 제목(12 px 중간 굵기, 32 px 행)
int0중첩 단계 — 내비가 설정
varnull소유하는 SyNav(내비가 설정)

메서드

메서드설명
activeValue 설정; 일치하는 행이 활성이 됨, 시그널 없음
true: 이 행을 활성 행으로; false: activeValue를 지움. 시그널 없음
가지를 열고 값을 보고; 비활성이거나 이미 열려 있으면 무시
가지를 닫고 값을 보고; 이미 닫혀 있으면 무시(비활성이어도 허용)
열려 있으면 setClose(), 아니면 setOpen()

시그널

시그널인자시점
value: string사용 가능한 행을 클릭함(또는 Space / Enter) — activeValue는 이미 그 값 — 또는 가지가 열리거나 닫힘(가지의 value; activeValue 그대로). 코드에서 activeValue, setActive(), 가지의 open을 설정할 때는 아님
value: string이 행이 클릭됨; 내비의 것 직전에 발생
value: string이 가지가 사용자 조작이나 메서드로 열리거나 닫힘; 내비의 것 직전에 발생

동작

항목동작 / 조건
클릭이 보고하는 값이자 activeValue와 비교되는 값; 빈 값은 절대 활성 아님
활성 행의 value. 경로를 따르려면 설정; 클릭도 설정함
사용 가능한 행을 클릭함(또는 Space / Enter) — activeValue는 이미 그 값 — 또는 가지가 열리거나 닫힘(가지의 value; activeValue 그대로). 코드에서 activeValue, setActive(), 가지의 open을 설정할 때는 아님
activeValue 설정; 일치하는 행이 활성이 됨, 시그널 없음
헤더 글자
가지 상태; 설정하면 조용히 열리거나 닫히고, 읽어서 알 수 있음
가지를 열고 값을 보고; 비활성이거나 이미 열려 있으면 무시
가지를 닫고 값을 보고; 이미 닫혀 있으면 무시(비활성이어도 허용)
열려 있으면 setClose(), 아니면 setOpen()
이 가지가 사용자 조작이나 메서드로 열리거나 닫힘; 내비의 것 직전에 발생
가지가 열리거나 닫힐 때 selected로 보고되는 값
SyNavGroup은 32 px 제목 행(12 px 중간 굵기, 행들과 같은 들여쓰기)을 그리고 안에 선언한 행들을 같은 깊이로 잇습니다. 상태가 없고 아무것도 보고하지 않습니다.
모든 행과 가지 헤더 멈춤
헤더 멈춤; 안의 행은 자기 상태 유지
내비는 세로 열입니다: width를 주십시오.
Tab이 사용 가능한 행과 가지 헤더를 차례로 지납니다(포커스된 항목은 1 px 외곽선). 행에서 Space / Enter는 선택. 가지 헤더에서 Space / Enter는 토글, Right는 열기, Left는 닫기. Up / Down 이동은 없습니다. Tab을 쓰십시오.
중첩된 것까지 모든 SyNavItem과 SyNavSub를 순서대로(그룹 제외); 내비가 유지

키보드

항목동작 / 조건
SyLayoutSider가 내비의 흔한 자리이고, SyMenu는 작업용 팝업 짝이며, SyBreadcrumb는 내비가 이끈 경로를 보여 줍니다.