QML
← 전체 컴포넌트

Form

여러 입력 필드를 묶어 값을 검증하고 제출을 처리하는 폼입니다.

import Syidax.Core.Form

지원 QML 타입

타입정의 / 역할
이름이 있는 필드를 모아 함께 검증하고 값을 제출합니다.
라벨·입력 영역·도움말/오류 줄과 검증 상태를 제공하는 폼 필드의 기반 타입입니다.

예제로 보기

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

01 기본 구성

SyForm은 폼 계층입니다.

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

    

    Column {
        spacing: 12
        SyForm {
            id: profile
            onSubmitted: (values) => output.log(("submitted: %1").arg(JSON.stringify(values)))
            Column {
                spacing: 12
                SyInput { name: "name"; label: "이름"; required: true }
                SyInput { name: "email"; label: "이메일"; type: "email" }
                SyInputNumber { name: "age"; label: "나이"; min: 0; max: 120 }
                Row {
                    spacing: 8
                    SyButton { id: exampleControl1;  text: "제출"; variant: "primary"; onClicked: profile.submit() }
                    SyButton { id: exampleControl2;  text: "초기화"; onClicked: profile.reset() }
                }
            }
        }
        EventLog { id: output }
    }

}

02 validation

폼은 각 필드에 물어 검증합니다.

Qt 실행 화면 · 이미지
validation · 기본
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
        SyForm {
            id: signUp
            Column {
                spacing: 12
                SyInput { name: "user"; label: "닉네임"; required: true; min: 3 }
                SyInput { name: "password"; label: "비밀번호"; variant: "password"; required: true; min: 8 }
                SyTextarea { name: "bio"; label: "소개"; rows: 2; max: 60; counter: true }
            }
        }
        Row {
            spacing: 8
            SyButton { id: exampleControl1;  text: "signUp.reportValidity()"; variant: "secondary"; size: "small"; onClicked: output.log("reportValidity() → " + signUp.reportValidity()) }
            SyButton { id: exampleControl2;  text: "signUp.checkValidity()"; variant: "secondary"; size: "small"; onClicked: output.log("checkValidity() → " + signUp.checkValidity()) }
        }
        EventLog { id: output }
    }
}

03 submitted · invalid · didReset

폼에는 시그널이 셋 있습니다.

Qt 실행 화면 · 이미지
submitted · invalid · didReset · 기본
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
    // Focused Gallery routes: keep only the selected API and its prerequisites.
    id: featureStory

    

    Column {
        spacing: 12
        SyForm {
            id: contact
            onSubmitted: (values) => { if (true) { output.log(("submitted: %1").arg(JSON.stringify(values))) } }
            onInvalid: (fields) => { if (true) { output.log(("invalid: %1").arg(fields.map((f) => f.name).join(", "))) } }
            onDidReset: { if (true) { output.log("reset") } }
            Column {
                spacing: 12
                SyInput { name: "name"; label: "이름"; required: true }
                SyInput { name: "email"; label: "이메일"; type: "email"; required: true }
                Row {
                    spacing: 8
                    SyButton { id: exampleControl1;  text: "제출"; variant: "primary"; onClicked: contact.submit() }
                    SyButton { id: exampleControl2;  text: "초기화"; onClicked: contact.reset() }
                }
            }
        }
        EventLog { id: output }
    }
}

04 values · field · fields · reset

코드에서 폼 읽기:

Qt 실행 화면 · 이미지
values · field · fields · reset · 기본
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
    // Focused Gallery routes: keep only the selected API and its prerequisites.
    id: featureStory

    Column {
        spacing: 12
        SyForm {
            id: order
            Column {
                spacing: 12
                SyInput { name: "item"; label: "품목"; value: "책상 조명" }
                SyInputNumber { name: "qty"; label: "수량"; value: 2; min: 1 }
            }
        }
        Flow {
            width: 560
            spacing: 8
            SyButton { id: exampleControl1;  visible: true; text: "order.values()"; variant: "secondary"; size: "small"; onClicked: output.log("values() → " + JSON.stringify(order.values())) }
            SyButton { id: exampleControl2;  visible: true; text: "order.field(\"qty\").value"; variant: "secondary"; size: "small"; onClicked: output.log("field(\"qty\").value → " + JSON.stringify(order.field("qty").value)) }
            SyButton { id: exampleControl3;  visible: true; text: "order.fields().length"; variant: "secondary"; size: "small"; onClicked: output.log("fields().length → " + order.fields().length) }
            SyButton { visible: true; text: "order.reset()"; variant: "secondary"; size: "small"; onClicked: order.reset() }
        }
        EventLog { id: output }
    }
}

API 93

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

속성 · SyForm

속성타입기본값설명
Item…—기본 속성. 폼 안에 선언한 아이템 — 레이아웃, 필드, 버튼.
bool(읽기 전용)true아이템을 폼으로 표시합니다. 필드가 이것으로 소속 폼을 찾습니다.

속성 · SyFieldFrame(모든 필드가 상속)

속성타입기본값설명
string""values() / submitted의 키. 이름 없는 필드는 검증은 되지만 제출되지 않습니다.
var""필드의 값 — 텍스트 필드는 문자열, 숫자 필드는 숫자 또는 "", 라디오 그룹은 선택지 값. 체크박스와 스위치는 여기에 "on"을 두고 체크된 동안에만 제출합니다.
string""본문 위의 제목(스위치는 트랙 옆). 비어 있으면 숨김.
boolfalse* 표시를 더하고, 비어 있거나 / 체크 안 됐거나 / 선택 없는 필드를 valueMissing으로 만듭니다.
boolfalse반응하지 않는 필드. 항상 유효하며 values()가 건너뜁니다.
string"medium"small · medium · large — 텍스트·숫자 필드는 24 · 32 · 40 px 높이, 텍스트에어리어는 자체 크기 체계.
string""본문 아래 도움말 줄. 오류가 보이는 동안 숨김.
string""필드가 무효인 동안 기본 문구 대신 보일 사용자 정의 오류 문구. 설정해도 필드가 무효가 되지는 않습니다.
boolfalse컨트롤이 포커스를 잃은 뒤(또는 setCustomError() 뒤) true. invalid의 두 관문 중 하나.
boolfalsereportValidity()가 호출된 뒤 true. invalid의 다른 관문. reset()이 지웁니다.
boolfalsesetCustomError()와 clearCustomError() 사이에 true. 그동안 상태는 custom.
string""현재 유효성 상태(위의 어휘 참고).
bool(읽기 전용)—validStatus === "".
bool(읽기 전용)—(touched || submitted) && !valid — 오류 줄과 무효 색조가 보이는 상태.
읽기 전용—보이게 될 문구, 그리고 지금 오류 줄 / 도움말 줄이 보이는지 여부.
읽기 전용—보이게 될 문구, 그리고 지금 오류 줄 / 도움말 줄이 보이는지 여부.
읽기 전용—보이게 될 문구, 그리고 지금 오류 줄 / 도움말 줄이 보이는지 여부.
var({})기본 문구에 필요한 { min, max, type, step }. 필드가 채웁니다.
real240앱이 width를 정하지 않을 때의 암시적 너비. 본문과 줄들은 필드 너비를 따릅니다.
booltrue제목 줄을 그릴지 여부.
real4제목·본문·메시지 줄 사이의 간격.
bool(읽기 전용)—필드가 만들어지는 동안 false. changed는 true가 된 뒤에만 발생합니다.
var—필드 로딩이 끝날 때 잡아 둔 값. reset()이 이리로 돌아갑니다.
bool(읽기 전용)true아이템을 SyForm의 필드로 표시합니다.

메서드 · SyForm

메서드설명
안에 선언한 모든 필드, 트리 순서, 중첩 폼 제외. 아이템 목록을 돌려줍니다.
name이 일치하는 첫 필드 또는 null.
이름 있고 활성인 필드의 { name: value }(필드가 정의하면 formValue). 검증 없음.
모든 필드의 checkValidity()가 true이면 true.
모든 필드의 reportValidity() 호출(오류가 나타남), 첫 무효 필드에 포커스, true / false 반환.
reportValidity() 뒤 submitted(values()), 또는 실패 필드와 함께 invalid(fields)(첫 필드 포커스). 반환값 없음.
각 필드의 reset(), 그다음 didReset().

메서드 · SyFieldFrame(모든 필드에서 사용 가능)

메서드설명
상태가 ""이면 true. 조용히.
submitted를 설정하고(이제부터 오류 줄이 보임) true / false를 돌려줍니다.
상태를 custom으로 강제하고 필드를 touched로 표시하므로 오류(error, 또는 "Invalid by custom")가 즉시 보입니다. 메시지 인자는 받지 않습니다.
custom 상태를 해제합니다. 일반 검사가 다시 적용되며 touched는 남습니다.
현재 상태 문자열, 유효하면 "".
value를 initialValue로, touched·submitted·사용자 정의 오류를 지웁니다.
필드가 선언된 SyForm 또는 null.
새로 계산한 상태, 그리고 그것으로 만든 시그널 페이로드.
새로 계산한 상태, 그리고 그것으로 만든 시그널 페이로드.
상태별 기본 문구, 그리고 email · url · tel · number에 쓰는 형식 검사.
상태별 기본 문구, 그리고 email · url · tel · number에 쓰는 형식 검사.

메서드 · SyFieldFrame(모든 필드에서 사용 가능)

항목동작 / 조건
각 필드는 자기 함수를 더합니다 — 모든 필드의 setFocus() / setBlur(), 체크박스와 스위치의 toggle(), 라디오 그룹의 select(), 숫자 필드의 stepUp() / stepDown() / setClear().

시그널 · SyForm

시그널인자발생 시점
values: { name: value, … }submit() 뒤 모든 필드가 유효할 때. reportValidity()는 발생시키지 않습니다.
fields: [필드 아이템, …] 트리 순서submit() 뒤 하나 이상의 필드가 실패했을 때. 첫 필드가 포커스를 갖고, 실패한 모든 필드가 오류를 보입니다. submitted와 함께 발생하지 않습니다.
—reset()이 모든 필드를 초기화한 뒤.

시그널 · SyFieldFrame

시그널인자발생 시점
detail: { value, isValid, status }(텍스트에어리어는 length 추가, 체크박스 / 스위치는 다름)로딩 뒤 value가 바뀜 — 사용자든 코드든. 초기값에는 발생하지 않음.
같은 모양컨트롤이 활성 포커스를 얻음.
같은 모양컨트롤이 포커스를 잃음. touched가 이미 true이므로 실패한 필드는 이제부터 오류를 보임.

동작

항목동작 / 조건
안에 선언한 모든 필드, 트리 순서, 중첩 폼 제외. 아이템 목록을 돌려줍니다.
아이템을 SyForm의 필드로 표시합니다.
이름 있고 활성인 필드의 { name: value }(필드가 정의하면 formValue). 검증 없음.
values() / submitted의 키. 이름 없는 필드는 검증은 되지만 제출되지 않습니다.
반응하지 않는 필드. 항상 유효하며 values()가 건너뜁니다.
필드의 값 — 텍스트 필드는 문자열, 숫자 필드는 숫자 또는 "", 라디오 그룹은 선택지 값. 체크박스와 스위치는 여기에 "on"을 두고 체크된 동안에만 제출합니다.
모든 필드의 checkValidity()가 true이면 true. 첫 실패에서 멈추고 아무것도 보이지 않음.
모든 필드의 reportValidity() 호출(오류가 나타남), 첫 무효 필드에 포커스, true / false 반환. 시그널 없음.
reportValidity() 뒤 submitted(values()), 또는 실패 필드와 함께 invalid(fields)(첫 필드 포커스). 반환값 없음.
reportValidity()가 호출된 뒤 true. invalid의 다른 관문. reset()이 지웁니다.
(touched || submitted) && !valid — 오류 줄과 무효 색조가 보이는 상태.
각 필드의 reset(), 그다음 didReset().
필드 로딩이 끝날 때 잡아 둔 값. reset()이 이리로 돌아갑니다.
reset()이 모든 필드를 초기화한 뒤.
안의 필드가 폼을 채워야 한다면 폼에 width(또는 앵커)를 주십시오.

동작 · 필드 계약(SyFieldFrame)

항목동작 / 조건
본문 위의 제목(스위치는 트랙 옆). 비어 있으면 숨김.
* 표시를 더하고, 비어 있거나 / 체크 안 됐거나 / 선택 없는 필드를 valueMissing으로 만듭니다.
제목 줄을 그릴지 여부.
본문 아래 도움말 줄. 오류가 보이는 동안 숨김.
(touched || submitted) && !valid — 오류 줄과 무효 색조가 보이는 상태.
현재 유효성 상태(위의 어휘 참고).
상태를 custom으로 강제하고 필드를 touched로 표시하므로 오류(error, 또는 "Invalid by custom")가 즉시 보입니다. 메시지 인자는 받지 않습니다.
validStatus === "".
컨트롤이 포커스를 잃은 뒤(또는 setCustomError() 뒤) true. invalid의 두 관문 중 하나.
reportValidity()가 호출된 뒤 true. invalid의 다른 관문. reset()이 지웁니다.
submitted를 설정하고(이제부터 오류 줄이 보임) true / false를 돌려줍니다.
필드가 무효인 동안 기본 문구 대신 보일 사용자 정의 오류 문구. 설정해도 필드가 무효가 되지는 않습니다.
반응하지 않는 필드. 항상 유효하며 values()가 건너뜁니다.
로딩 뒤 value가 바뀜 — 사용자든 코드든. 초기값에는 발생하지 않음.
필드의 값 — 텍스트 필드는 문자열, 숫자 필드는 숫자 또는 "", 라디오 그룹은 선택지 값. 체크박스와 스위치는 여기에 "on"을 두고 체크된 동안에만 제출합니다.
필드가 만들어지는 동안 false. changed는 true가 된 뒤에만 발생합니다.
컨트롤이 활성 포커스를 얻음.
컨트롤이 포커스를 잃음. touched가 이미 true이므로 실패한 필드는 이제부터 오류를 보임.
changed(detail)는 필드 로딩이 끝난 뒤 value가 바뀔 때마다 발생합니다 — 타이핑, 지우기 버튼, 메서드, 코드에서의 대입 모두. focused(detail)는 컨트롤이 활성 포커스를 얻을 때, blured(detail)는 잃을 때(직전에 touched가 true가 됨) 발생합니다. detail은 텍스트·숫자 필드에서 { value, isValid, status }, 텍스트에어리어에서 { value, length, isValid, status }이고, 체크박스와 스위치는 자기 모양을 전달합니다(해당 페이지 참고).

동작 · 필드 계약(SyFieldFrame)

상태문구
This field is required
Value must be at least {min} characters long
Value cannot exceed {max} characters
Please enter a valid email address / URL / phone number / number(type별), 그 밖에는 "Please enter a valid value"
Value must be at least {min}
Value cannot exceed {max}
Value must be a multiple of {step} starting from {min 또는 0}
Invalid by custom