QML
← 전체 컴포넌트

Avatar Group

여러 사용자의 아바타를 한 줄에 모아 표시합니다. 표시 개수를 넘는 구성원은 추가 인원 수로 요약할 수 있습니다.

import Syidax.Core.Avatar

지원 QML 타입

타입정의 / 역할
프로필 이미지·아이콘·글자·이니셜을 표시합니다.
아바타를 겹쳐 묶고 표시 한도를 넘은 개수를 보여줍니다.

예제로 보기

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

01 기본 구성

SyAvatarGroup은 안에 선언한 SyAvatar 아이템을 한 줄로 배치합니다 — 동전 더미처럼 겹치거나(variant: "stack", 기본) 간격을 두고("grid") — 그리고 하나의 size와 하나의 clickable을 모두에게 적용합니다.

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
    id: story

    property QtObject settings: QtObject {
        id: storyArgs
        property string variant: "stack"
        property string size: "medium"
        property int maxCount: 3
        property bool clickable: false
    }

    

    Column {
        spacing: 12
        SyAvatarGroup {
            variant: storyArgs.variant
            size: storyArgs.size
            maxCount: storyArgs.maxCount
            clickable: storyArgs.clickable
            onSelected: (detail) => output.log(("선택: %1").arg(detail.text))
            SyAvatar { text: "홍길동"; variant: "purple" }
            SyAvatar { text: "김철수"; variant: "blue" }
            SyAvatar { text: "이영희"; variant: "green" }
            SyAvatar { text: "박민수"; variant: "orange" }
            SyAvatar { text: "최지우"; variant: "teal" }
        }
        EventLog { id: output }
    }

}

02 variant

variant가 구성원의 배치를 정합니다.

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

Item {
    implicitWidth: Math.max(360, childrenRect.width)
    implicitHeight: childrenRect.height
    readonly property string members: [
        "SyAvatar { text: " + JSON.stringify("홍길동") + "; variant: \"purple\" }",
        "SyAvatar { text: " + JSON.stringify("김철수") + "; variant: \"blue\" }",
        "SyAvatar { text: " + JSON.stringify("이영희") + "; variant: \"green\" }"
    ].join("\n")

    Column {
        spacing: 16
        SyAvatarGroup {
            SyAvatar { text: "홍길동"; variant: "purple" }
            SyAvatar { text: "김철수"; variant: "blue" }
            SyAvatar { text: "이영희"; variant: "green" }
        }
        SyAvatarGroup {
            variant: "grid"
            SyAvatar { text: "홍길동"; variant: "purple" }
            SyAvatar { text: "김철수"; variant: "blue" }
            SyAvatar { text: "이영희"; variant: "green" }
        }
    }
}

03 selected

selected(detail)은 그룹의 유일한 시그널입니다.

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
        SyAvatarGroup {
            maxCount: 2; clickable: true
            onSelected: (detail) => output.log(("선택: %1").arg(detail.text))
            SyAvatar { text: "홍길동"; variant: "purple" }
            SyAvatar { text: "김철수"; variant: "blue" }
            SyAvatar { text: "이영희"; variant: "green" }
            SyAvatar { text: "박민수"; variant: "orange" }
        }
        EventLog { id: output }
    }
}

04 격자형 아바타

variant 설정을 적용한 격자형 아바타 예제입니다.

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
    id: story

    property QtObject settings: QtObject {
        id: storyArgs
        property string variant: "grid"
        property string size: "medium"
        property int maxCount: 3
        property bool clickable: false
    }

    

    Column {
        spacing: 12
        SyAvatarGroup {
            variant: storyArgs.variant
            size: storyArgs.size
            maxCount: storyArgs.maxCount
            clickable: storyArgs.clickable
            onSelected: (detail) => output.log(("선택: %1").arg(detail.text))
            SyAvatar { text: "홍길동"; variant: "purple" }
            SyAvatar { text: "김철수"; variant: "blue" }
            SyAvatar { text: "이영희"; variant: "green" }
            SyAvatar { text: "박민수"; variant: "orange" }
            SyAvatar { text: "최지우"; variant: "teal" }
        }
        EventLog { id: output }
    }

}

API 37

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

속성

속성타입기본값설명
——SyAvatar 구성원(선언 또는 Repeater로 생성).
string"stack"stack(크기별 4 / 6 / 8 px 겹침) 또는 grid(2 / 4 / 6 px 간격).
string"medium"small 24 · medium 32 · large 40. 모든 구성원에 기록.
boolfalsefalse면 구성원 자신의 clickable은 그대로.
int0"+n" 원판 앞에 보이는 구성원 수. 0 = 전부.
var (읽기 전용)—구성원 아이템.
int—그려지는 수
var (읽기 전용)—숨겨진 구성원.
real (읽기 전용)—아바타 지름
real (읽기 전용)—구성원 사이의 x 거리.

메서드

메서드설명
구성원에 크기, 클릭 가능 여부, 보임, 위치를 다시 적용(관련 변화마다 자동 실행).

시그널

시그널인자시점
detail: { letter, text, icon, image }보이는 구성원이 클릭됨(구성원에서 전달) 또는 "+n" 목록 행이 클릭됨. 둘 다 clickable 필요.

동작

항목동작 / 조건
아바타는 SyAvatar처럼 보이는(initials를 가진) 그룹의 자식입니다.
완료 시점과 자식, size, clickable, maxCount, variant가 바뀔 때마다 layout()이 실행됩니다: 모든 구성원이 그룹의 size를(그룹이 clickable이면 clickable: true도 — 아니면 구성원 자신의 clickable은 그대로) 받고, 인덱스가 shownCount 미만이면 visible이 되며, x = index × step, y = 0, z = index가 되고, 그 selected가 그룹의 것에 연결됩니다.
완료 시점과 자식, size, clickable, maxCount, variant가 바뀔 때마다 layout()이 실행됩니다: 모든 구성원이 그룹의 size를(그룹이 clickable이면 clickable: true도 — 아니면 구성원 자신의 clickable은 그대로) 받고, 인덱스가 shownCount 미만이면 visible이 되며, x = index × step, y = 0, z = index가 되고, 그 selected가 그룹의 것에 연결됩니다. 그룹이 clickable이면 원판과 행이 포인터 커서를 보이고, 행은 호버 시 강조되며, 행을 클릭하면 그 구성원의 detail로 selected가 발생하고 목록이 닫힙니다. 그룹의 selected는 구성원의 selected를 전달한 것입니다: 보이는 구성원에 대해서는 구성원이 클릭 가능하고(그룹이 clickable이면 모든 구성원이 그렇고, 아니면 구성원 자신의 clickable이 기준) disabled가 아닐 때만 발생합니다. 목록의 행은 그룹이 clickable일 때만 발생시킵니다.
"+n" 원판 앞에 보이는 구성원 수. 0 = 전부.
stack(크기별 4 / 6 / 8 px 겹침) 또는 grid(2 / 4 / 6 px 간격).
구성원에 크기, 클릭 가능 여부, 보임, 위치를 다시 적용(관련 변화마다 자동 실행).
small 24 · medium 32 · large 40. 모든 구성원에 기록.
true면 모든 구성원이 clickable이 되고 "+n" 목록 행도 켜짐. false면 구성원 자신의 clickable은 그대로.
완료 시점과 자식, size, clickable, maxCount, variant가 바뀔 때마다 layout()이 실행됩니다: 모든 구성원이 그룹의 size를(그룹이 clickable이면 clickable: true도 — 아니면 구성원 자신의 clickable은 그대로) 받고, 인덱스가 shownCount 미만이면 visible이 되며, x = index × step, y = 0, z = index가 되고, 그 selected가 그룹의 것에 연결됩니다. implicitWidth = diameter + (shownCount − 1 + (remaining ? 1 : 0)) × step(구성원이 없으면 0), implicitHeight = diameter. maxCount > 0이면 shownCount = min(maxCount, count)이고 remaining은 그 너머의 구성원을 담습니다.
완료 시점과 자식, size, clickable, maxCount, variant가 바뀔 때마다 layout()이 실행됩니다: 모든 구성원이 그룹의 size를(그룹이 clickable이면 clickable: true도 — 아니면 구성원 자신의 clickable은 그대로) 받고, 인덱스가 shownCount 미만이면 visible이 되며, x = index × step, y = 0, z = index가 되고, 그 selected가 그룹의 것에 연결됩니다.
완료 시점과 자식, size, clickable, maxCount, variant가 바뀔 때마다 layout()이 실행됩니다: 모든 구성원이 그룹의 size를(그룹이 clickable이면 clickable: true도 — 아니면 구성원 자신의 clickable은 그대로) 받고, 인덱스가 shownCount 미만이면 visible이 되며, x = index × step, y = 0, z = index가 되고, 그 selected가 그룹의 것에 연결됩니다.
완료 시점과 자식, size, clickable, maxCount, variant가 바뀔 때마다 layout()이 실행됩니다: 모든 구성원이 그룹의 size를(그룹이 clickable이면 clickable: true도 — 아니면 구성원 자신의 clickable은 그대로) 받고, 인덱스가 shownCount 미만이면 visible이 되며, x = index × step, y = 0, z = index가 되고, 그 selected가 그룹의 것에 연결됩니다. stack: step = diameter − (4 | 6 | 8). grid: step = diameter + (2 | 4 | 6). implicitWidth = diameter + (shownCount − 1 + (remaining ? 1 : 0)) × step(구성원이 없으면 0), implicitHeight = diameter.
완료 시점과 자식, size, clickable, maxCount, variant가 바뀔 때마다 layout()이 실행됩니다: 모든 구성원이 그룹의 size를(그룹이 clickable이면 clickable: true도 — 아니면 구성원 자신의 clickable은 그대로) 받고, 인덱스가 shownCount 미만이면 visible이 되며, x = index × step, y = 0, z = index가 되고, 그 selected가 그룹의 것에 연결됩니다.
보이는 구성원이 클릭됨(구성원에서 전달) 또는 "+n" 목록 행이 클릭됨. 둘 다 clickable 필요.
diameter는 size small / medium / large에 24 / 32 / 40입니다. stack: step = diameter − (4 | 6 | 8). grid: step = diameter + (2 | 4 | 6). implicitWidth = diameter + (shownCount − 1 + (remaining ? 1 : 0)) × step(구성원이 없으면 0), implicitHeight = diameter.
implicitWidth = diameter + (shownCount − 1 + (remaining ? 1 : 0)) × step(구성원이 없으면 0), implicitHeight = diameter.
implicitWidth = diameter + (shownCount − 1 + (remaining ? 1 : 0)) × step(구성원이 없으면 0), implicitHeight = diameter. maxCount > 0이면 shownCount = min(maxCount, count)이고 remaining은 그 너머의 구성원을 담습니다. 그들은 숨겨지고 마지막 보이는 구성원 뒤에 "+n" 원판(같은 지름, lightgray 토큰, n = remaining.length)이 그려집니다.
implicitWidth = diameter + (shownCount − 1 + (remaining ? 1 : 0)) × step(구성원이 없으면 0), implicitHeight = diameter.
원판을 호버하면 그 아래 160 px 팝업이 열려 숨겨진 구성원마다 이니셜과 색을 가진 24 px 원판과 label(tooltipContent / text / letter, 또는 "Avatar")을 나열합니다.
원판을 호버하면 그 아래 160 px 팝업이 열려 숨겨진 구성원마다 이니셜과 색을 가진 24 px 원판과 label(tooltipContent / text / letter, 또는 "Avatar")을 나열합니다.
원판을 호버하면 그 아래 160 px 팝업이 열려 숨겨진 구성원마다 이니셜과 색을 가진 24 px 원판과 label(tooltipContent / text / letter, 또는 "Avatar")을 나열합니다.
원판을 호버하면 그 아래 160 px 팝업이 열려 숨겨진 구성원마다 이니셜과 색을 가진 24 px 원판과 label(tooltipContent / text / letter, 또는 "Avatar")을 나열합니다.
그룹이 clickable이면 원판과 행이 포인터 커서를 보이고, 행은 호버 시 강조되며, 행을 클릭하면 그 구성원의 detail로 selected가 발생하고 목록이 닫힙니다.
그룹의 selected는 구성원의 selected를 전달한 것입니다: 보이는 구성원에 대해서는 구성원이 클릭 가능하고(그룹이 clickable이면 모든 구성원이 그렇고, 아니면 구성원 자신의 clickable이 기준) disabled가 아닐 때만 발생합니다.

키보드

항목동작 / 조건
SyAvatar(구성원), SyTooltip(단일 아바타에 호버 이름이 필요할 때), SyCard / SyTable(구성원 행이 보통 놓이는 곳).