QML
← 전체 컴포넌트

Spinner

완료 비율을 알 수 없는 작업이 진행 중임을 회전 표시로 알립니다.

import Syidax.Core.Spinner

지원 QML 타입

타입정의 / 역할
작업 진행 중임을 알려주는 회전 표시기입니다.

예제로 보기

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

01 기본 구성

SySpinner는 "무언가 불러오는 중"임을 알리는 도는 호입니다.

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

Item {
    implicitWidth: Math.max(360, childrenRect.width)
    implicitHeight: childrenRect.height
    id: story

    property QtObject settings: QtObject {
        id: storyArgs
        property string size: "medium"
        property string description: ""
        property bool hidden: false
        property bool inline: false
    }

    

    Rectangle {
        width: 320
        height: 120
        color: Theme.semantic.backgroundDefault
        border.width: 1
        border.color: Theme.semantic.borderSubtle
        radius: Foundation.borderRadiusMedium
        Text {
            x: 16
            y: 16
            width: parent.width - 32
            wrapMode: Text.WordWrap
            text: "이 영역의 내용을 가져오는 중입니다. 스피너가 가리기 전까지는 그대로 읽을 수 있습니다."
            font.family: Theme.fontFamily
            font.pixelSize: 13
            color: Theme.semantic.textSubtle
        }
        SySpinner {
            anchors.centerIn: storyArgs.inline ? undefined : parent
            anchors.fill: storyArgs.inline ? parent : undefined
            size: storyArgs.size
            description: storyArgs.description
            hidden: storyArgs.hidden
            inline: storyArgs.inline
        }
    }

}

02 size

size는 호의 지름을 정합니다: "small" 12 px, "medium" 16 px(기본), "large" 20 px, "xlarge" 24 px.

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

pragma ComponentBehavior: Bound

Item {
    implicitWidth: Math.max(360, childrenRect.width)
    implicitHeight: childrenRect.height
    id: story
    readonly property var sizes: ["small", "medium", "large", "xlarge"]

    Row {
        spacing: 32
        Repeater {
            model: story.sizes
            delegate: Column {
                id: cell
                required property string modelData
                spacing: 8
                Item {
                    anchors.horizontalCenter: parent.horizontalCenter
                    width: 24
                    height: 24
                    SySpinner { anchors.centerIn: parent; size: cell.modelData }
                }
                Text { anchors.horizontalCenter: parent.horizontalCenter; text: cell.modelData; font.family: Theme.fontFamily; font.pixelSize: 11; color: Theme.semantic.textSubtle }
            }
        }
    }
}

03 description

description은 호 아래 4 px에 가운데 맞춰 쓰이는 14 px 한 줄 글입니다 — "불러오는 중…", "변경 사항 저장 중".

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

Item {
    implicitWidth: Math.max(360, childrenRect.width)
    implicitHeight: childrenRect.height
    property QtObject settings: QtObject {
        id: storyArgs
        property string description: "불러오는 중…"
    }

    

    SySpinner {
        size: "large"
        description: storyArgs.description
        SyButton { text: "취소"; size: "small"; variant: "borderless" }
    }
}

04 inline

inline: true는 스피너를 오버레이로 바꿉니다: 페이지 배경색의 80 % 불투명 마스크가 스피너 자체의 영역을 채우고 호(설명과 내용 포함)가 그 가운데 놓여, 이전 내용이 희미하게 보이되 반응하지 않는 것처럼 보입니다.

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

Item {
    implicitWidth: Math.max(360, childrenRect.width)
    implicitHeight: childrenRect.height
    property QtObject settings: QtObject {
        id: storyArgs
        property bool inline: true
    }

    

    Rectangle {
        width: 320
        height: 120
        color: Theme.semantic.backgroundDefault
        border.width: 1
        border.color: Theme.semantic.borderSubtle
        radius: Foundation.borderRadiusMedium
        Text {
            x: 16
            y: 16
            width: parent.width - 32
            wrapMode: Text.WordWrap
            text: "이 영역의 내용을 가져오는 중입니다. 스피너가 가리기 전까지는 그대로 읽을 수 있습니다."
            font.family: Theme.fontFamily
            font.pixelSize: 13
            color: Theme.semantic.textSubtle
        }
        SySpinner { anchors.fill: parent; inline: storyArgs.inline; description: "불러오는 중…" }
    }
}

05 delay

delay는 스피너가 만들어진 뒤 보이지 않은 채 기다리는 밀리초입니다(기본 0 = 즉시).

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

pragma ComponentBehavior: Bound

Item {
    implicitWidth: Math.max(360, childrenRect.width)
    implicitHeight: childrenRect.height
    property QtObject settings: QtObject {
        id: storyArgs
        property int delay: 800
    }

    

    Column {
        spacing: 12
        SyButton {
            text: "불러오기 (2.5초)"
            variant: "primary"
            loading: load.running
            onClicked: load.restart()
        }
        Item {
            width: 200
            height: 56
            Loader {
                anchors.centerIn: parent
                active: load.running
                sourceComponent: SySpinner { delay: storyArgs.delay; description: "불러오는 중…" }
            }
            Text {
                anchors.centerIn: parent
                visible: !load.running
                text: "불러오는 것 없음"
                font.family: Theme.fontFamily
                font.pixelSize: 13
                color: Theme.semantic.textSubtlest
            }
        }
        Timer { id: load; interval: 2500 }
    }
}

06 인라인 로딩

inline · size 설정을 적용한 인라인 로딩 예제입니다.

Qt 실행 화면 · 이미지
인라인 로딩 · 실행 결과
기본 실행 화면
QML 코드
import QtQuick
import Syidax.Core

Item {
    implicitWidth: Math.max(360, childrenRect.width)
    implicitHeight: childrenRect.height
    id: story

    property QtObject settings: QtObject {
        id: storyArgs
        property string size: "small"
        property string description: ""
        property bool hidden: false
        property bool inline: true
    }

    

    Rectangle {
        width: 320
        height: 120
        color: Theme.semantic.backgroundDefault
        border.width: 1
        border.color: Theme.semantic.borderSubtle
        radius: Foundation.borderRadiusMedium
        Text {
            x: 16
            y: 16
            width: parent.width - 32
            wrapMode: Text.WordWrap
            text: "이 영역의 내용을 가져오는 중입니다. 스피너가 가리기 전까지는 그대로 읽을 수 있습니다."
            font.family: Theme.fontFamily
            font.pixelSize: 13
            color: Theme.semantic.textSubtle
        }
        SySpinner {
            anchors.centerIn: storyArgs.inline ? undefined : parent
            anchors.fill: storyArgs.inline ? parent : undefined
            size: storyArgs.size
            description: storyArgs.description
            hidden: storyArgs.hidden
            inline: storyArgs.inline
        }
    }

}

API 21

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

속성

속성타입기본값설명
list (기본 속성)—호 / 설명 아래 16 px에 가운데로 배치되는 아이템.
string"medium""small" 12 · "medium" 16 · "large" 20 · "xlarge" 24 px — 호의 지름.
string""호 아래의 14 px 글; 접근성 이름이기도 합니다.
boolfalse스피너를 숨깁니다(숨긴 동안 크기를 차지하지 않음).
boolfalse오버레이 모드: 반투명 마스크가 스피너 영역을 채우고 호가 그 가운데 놓입니다. 암시적 크기는 0이 됩니다.
int0생성 뒤(또는 delay 재할당 뒤) 보이지 않은 채 기다리는 밀리초.
real (읽기 전용)—현재 size에 따른 호의 지름.
bool (읽기 전용)—!hidden이고 지연이 지남; visible이 여기에 바인딩됩니다.
bool (읽기 전용)—호가 돌고 있음: shown, visible이고 Theme.reducedMotion이 꺼짐.

메서드

항목동작 / 조건
SySpinner는 메서드를 선언하지 않습니다 — hidden, delay로 또는 로딩마다 새로 만들어 제어하십시오.

시그널

항목동작 / 조건
SySpinner는 자체 시그널을 선언하지 않습니다. 속성 변경 시그널 onShownChanged와 onSpinningChanged를 쓰십시오.
SySpinner는 자체 시그널을 선언하지 않습니다. 속성 변경 시그널 onShownChanged와 onSpinningChanged를 쓰십시오.

동작

항목동작 / 조건
보임 — visible은 읽기 전용 shown = !hidden이고 지연이 지남에 바인딩되어 있습니다. visible을 직접 설정하면 그 바인딩이 대체되므로 hidden을 쓰십시오. 모션 — spinning은 shown, visible이고 Theme.reducedMotion이 꺼진 동안 true입니다.
!hidden이고 지연이 지남; visible이 여기에 바인딩됩니다.
스피너를 숨깁니다(숨긴 동안 크기를 차지하지 않음).
생성 뒤(또는 delay 재할당 뒤) 보이지 않은 채 기다리는 밀리초.
"small" 12 · "medium" 16 · "large" 20 · "xlarge" 24 px — 호의 지름.
호 아래의 14 px 글; 접근성 이름이기도 합니다.
오버레이 모드: 반투명 마스크가 스피너 영역을 채우고 호가 그 가운데 놓입니다. 암시적 크기는 0이 됩니다.
호가 돌고 있음: shown, visible이고 Theme.reducedMotion이 꺼짐.

키보드

항목동작 / 조건
레이아웃을 유지하는 자리 표시에는 SySkeleton, 알려진 진행에는 SyProgressBar / SyProgressCircular, 버튼 안의 스피너에는 SyButton(loading).