QML
← 전체 컴포넌트

Code Viewer

실행 중인 QML 예제와 소스 코드를 함께 보여 줍니다. 문법 강조와 복사 기능이 있는 코드 영역만 따로 사용할 수도 있습니다.

import Syidax.Core.CodeViewer

지원 QML 타입

타입정의 / 역할
SyCodeRender 실행 화면과 접을 수 있는 SyCodeScript 코드 패널을 묶습니다.
예제의 실제 QML 콘텐츠를 담고 source로 표시할 코드를 제공합니다.
구문 강조·선택적 줄 번호·복사 버튼을 갖춘 소스 코드 패널입니다.

예제로 보기

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

01 기본 구성

SyCodeViewer는 살아 있는 아이템과 그 소스를 함께 보여 줍니다: 테두리 박스 위쪽에 SyCodeRender(안에 선언한 아이템을 그대로 그림), *SOURCE* 바, 그 아래에 SyCodeScript(코드를 language로 토큰화해 줄 단위로 그리며 선택적인 줄 번호 거터, 강조 줄, 복사 버튼을 갖춤).

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 language: "qml"
        property bool showLineNumbers: true
        property bool showCopyButton: true
        property bool wrap: false
        property string highlightLines: "2"
        property bool collapsible: true
        property bool defaultExpanded: true
        property string triggerLabel: "SOURCE"
    }

    readonly property string sample: "Row {\n    spacing: 8\n    SyButton { text: " + JSON.stringify("저장") + "; variant: \"primary\" }\n    SyTag { text: " + JSON.stringify("초안") + "; color: \"yellow\" }\n}"

    SyCodeViewer {
        width: 520
        language: storyArgs.language
        showLineNumbers: storyArgs.showLineNumbers
        showCopyButton: storyArgs.showCopyButton
        wrap: storyArgs.wrap
        highlightLines: storyArgs.highlightLines
        collapsible: storyArgs.collapsible
        defaultExpanded: storyArgs.defaultExpanded
        triggerLabel: storyArgs.triggerLabel
        SyCodeRender {
            source: story.sample
            Row {
                spacing: 8
                SyButton { text: "저장"; variant: "primary" }
                SyTag { text: "초안"; color: "yellow" }
            }
        }
        SyCodeScript { }
    }

}

02 SyCodeScript · language

SyCodeScript는 읽기 전용 코드 패널로 단독으로 동작합니다.

Qt 실행 화면 · 이미지
SyCodeScript · language · 기본
기본 실행 화면
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: story
    readonly property string js: "const total = items.reduce((sum, i) => sum + i.price, 0) // in cents\nrender(`Total: ${total / 100}`)"
    readonly property string html: "<section class=\"card\">\n  <h2 id=\"title\">Orders</h2>\n  <!-- rows -->\n</section>"
    readonly property string css: ".card {\n  --gap: 8px;\n  padding: var(--gap) 12px;\n  color: #1f2937;\n}"
    readonly property string json: "{ \"id\": 42, \"name\": \"Lee\", \"active\": true, \"tags\": [\"core\", \"qml\"] }"

    Column {
        spacing: 12
        SyCodeScript { id: featureTarget0; width: 520; language: "javascript"; showLineNumbers: true; code: story.js }
        SyCodeScript { id: featureTarget1; width: 520; language: "html"; code: story.html }
        SyCodeScript { id: featureTarget2; width: 520; language: "css"; highlightLines: "2"; code: story.css }
        SyCodeScript { id: featureTarget3; width: 520; language: "json"; showCopyButton: false; code: story.json }
    }
}

03 ready · expandedChanged · lineClick · copied

뷰어의 시그널:

Qt 실행 화면 · 이미지
ready · expandedChanged · lineClick · copied · 기본
기본 실행 화면
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: story

    readonly property string sample: "SyButton { text: " + JSON.stringify("저장") + " }"

    Column {
        spacing: 12
        SyCodeViewer {
            id: viewer
            width: 520; language: "qml"; showLineNumbers: true
            onReady: (detail) => { if (true) { output.log(("ready: render %1, script %2").arg(detail.hasRender).arg(detail.hasScript)) } }
            onExpandedChanged: { if (true) { output.log(("expanded: %1 (%2)").arg(viewer.expanded).arg(viewer.lastExpandSource)) } }
            SyCodeRender { source: story.sample; SyButton { text: "저장" } }
            SyCodeScript {
                onLineClick: (detail) => { if (true) { output.log(("lineClick: %1").arg(detail.line)) } }
                onCopied: (detail) => { if (true) { output.log(("copied: %1").arg(detail.language)) } }
            }
        }
        EventLog { id: output }
    }
}

04 강조할 코드 줄

highlightLines 설정을 적용한 강조할 코드 줄 예제입니다.

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 language: "qml"
        property bool showLineNumbers: true
        property bool showCopyButton: true
        property bool wrap: false
        property string highlightLines: "2,4"
        property bool collapsible: true
        property bool defaultExpanded: true
        property string triggerLabel: "SOURCE"
    }

    readonly property string sample: "Row {\n    spacing: 8\n    SyButton { text: " + JSON.stringify("저장") + "; variant: \"primary\" }\n    SyTag { text: " + JSON.stringify("초안") + "; color: \"yellow\" }\n}"

    SyCodeViewer {
        width: 520
        language: storyArgs.language
        showLineNumbers: storyArgs.showLineNumbers
        showCopyButton: storyArgs.showCopyButton
        wrap: storyArgs.wrap
        highlightLines: storyArgs.highlightLines
        collapsible: storyArgs.collapsible
        defaultExpanded: storyArgs.defaultExpanded
        triggerLabel: storyArgs.triggerLabel
        SyCodeRender {
            source: story.sample
            Row {
                spacing: 8
                SyButton { text: "저장"; variant: "primary" }
                SyTag { text: "초안"; color: "yellow" }
            }
        }
        SyCodeScript { }
    }

}

05 접힌 상태로 시작

collapsible · defaultExpanded 설정을 적용한 접힌 상태로 시작 예제입니다.

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 language: "qml"
        property bool showLineNumbers: true
        property bool showCopyButton: true
        property bool wrap: false
        property string highlightLines: "2"
        property bool collapsible: true
        property bool defaultExpanded: false
        property string triggerLabel: "SOURCE"
    }

    readonly property string sample: "Row {\n    spacing: 8\n    SyButton { text: " + JSON.stringify("저장") + "; variant: \"primary\" }\n    SyTag { text: " + JSON.stringify("초안") + "; color: \"yellow\" }\n}"

    SyCodeViewer {
        width: 520
        language: storyArgs.language
        showLineNumbers: storyArgs.showLineNumbers
        showCopyButton: storyArgs.showCopyButton
        wrap: storyArgs.wrap
        highlightLines: storyArgs.highlightLines
        collapsible: storyArgs.collapsible
        defaultExpanded: storyArgs.defaultExpanded
        triggerLabel: storyArgs.triggerLabel
        SyCodeRender {
            source: story.sample
            Row {
                spacing: 8
                SyButton { text: "저장"; variant: "primary" }
                SyTag { text: "초안"; color: "yellow" }
            }
        }
        SyCodeScript { }
    }

}

06 긴 코드 줄바꿈

wrap 설정을 적용한 긴 코드 줄바꿈 예제입니다.

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 language: "qml"
        property bool showLineNumbers: true
        property bool showCopyButton: true
        property bool wrap: true
        property string highlightLines: "2"
        property bool collapsible: true
        property bool defaultExpanded: true
        property string triggerLabel: "SOURCE"
    }

    readonly property string sample: "Row {\n    spacing: 8\n    SyButton { text: " + JSON.stringify("저장") + "; variant: \"primary\" }\n    SyTag { text: " + JSON.stringify("초안") + "; color: \"yellow\" }\n}"

    SyCodeViewer {
        width: 520
        language: storyArgs.language
        showLineNumbers: storyArgs.showLineNumbers
        showCopyButton: storyArgs.showCopyButton
        wrap: storyArgs.wrap
        highlightLines: storyArgs.highlightLines
        collapsible: storyArgs.collapsible
        defaultExpanded: storyArgs.defaultExpanded
        triggerLabel: storyArgs.triggerLabel
        SyCodeRender {
            source: story.sample
            Row {
                spacing: 8
                SyButton { text: "저장"; variant: "primary" }
                SyTag { text: "초안"; color: "yellow" }
            }
        }
        SyCodeScript { }
    }

}

07 간결한 코드 블록

showLineNumbers · showCopyButton 설정을 적용한 간결한 코드 블록 예제입니다.

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 language: "qml"
        property bool showLineNumbers: false
        property bool showCopyButton: false
        property bool wrap: false
        property string highlightLines: "2"
        property bool collapsible: true
        property bool defaultExpanded: true
        property string triggerLabel: "SOURCE"
    }

    readonly property string sample: "Row {\n    spacing: 8\n    SyButton { text: " + JSON.stringify("저장") + "; variant: \"primary\" }\n    SyTag { text: " + JSON.stringify("초안") + "; color: \"yellow\" }\n}"

    SyCodeViewer {
        width: 520
        language: storyArgs.language
        showLineNumbers: storyArgs.showLineNumbers
        showCopyButton: storyArgs.showCopyButton
        wrap: storyArgs.wrap
        highlightLines: storyArgs.highlightLines
        collapsible: storyArgs.collapsible
        defaultExpanded: storyArgs.defaultExpanded
        triggerLabel: storyArgs.triggerLabel
        SyCodeRender {
            source: story.sample
            Row {
                spacing: 8
                SyButton { text: "저장"; variant: "primary" }
                SyTag { text: "초안"; color: "yellow" }
            }
        }
        SyCodeScript { }
    }

}

08 Python 구문

language 설정을 적용한 Python 구문 예제입니다.

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

SyCodeScript {
    width: 520
    language: "python"
    showLineNumbers: true
    code: "def total(items):\n    return sum(item[\"amount\"] for item in items)\n\nprint(total([{\"amount\": 12}, {\"amount\": 30}]))"
}

API 83

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

속성 · SyCodeViewer

속성타입기본값설명
string"plaintext"스크립트의 토크나이저(스크립트가 자기 language를 정하지 않는 한).
boolfalse스크립트의 거터(상속).
booltrue스크립트의 복사 버튼(상속).
boolfalse가로 스크롤 대신 긴 줄 접기(상속).
real0스크립트 높이를 px로 제한하고 나머지를 스크롤. 0 = 제한 없음(상속).
string"""3,5-7" — 물들일 줄과 범위, 1부터 셈(상속).
booltrue두 부품이 모두 있을 때 *SOURCE* 바를 보임.
booltrueexpanded의 초기값.
booldefaultExpanded바 아래에 스크립트를 보일지. 바가 없으면 무시.
string"SOURCE"바의 글자.
varnull수집된 SyCodeRender / SyCodeScript.
varnull수집된 SyCodeRender / SyCodeScript.
bool (읽기 전용)—각 부품을 찾았는지.
bool (읽기 전용)—각 부품을 찾았는지.
string (읽기 전용)—렌더의 source(렌더가 없으면 "").
var (읽기 전용)—highlightLines를 정렬된 줄 번호 배열로 파싱한 것.
bool (읽기 전용)—바가 그려지는지
bool (읽기 전용)—스크립트가 지금 보이는지.
string"prop"사용자 토글의 expandedChanged 핸들러가 도는 동안 "user", 그 외 "prop".

속성 · SyCodeRender

속성타입기본값설명
string""짝이 되는 스크립트가 자기 code가 비어 있을 때 보이는 코드 글자.
varnull뷰어(뷰어가 설정).
——살아 있는 아이템. 12 px 여백의 물든 무대에 그려짐.

속성 · SyCodeScript

속성타입기본값설명
string""보일 글자. 뷰어 안에서 "" = 렌더의 source.
string""토크나이저 id 또는 별칭. "" = 뷰어의 것, 아니면 평문.
varundefinedundefined = 뷰어에서 상속. 단독 기본값 false · true · false · 0 · "".
varundefinedundefined = 뷰어에서 상속. 단독 기본값 false · true · false · 0 · "".
varundefinedundefined = 뷰어에서 상속. 단독 기본값 false · true · false · 0 · "".
varundefinedundefined = 뷰어에서 상속. 단독 기본값 false · true · false · 0 · "".
varundefinedundefined = 뷰어에서 상속. 단독 기본값 false · true · false · 0 · "".
varnull뷰어(뷰어가 설정).
string (읽기 전용)—실제로 보이고 토큰화되는 것.
string (읽기 전용)—실제로 보이고 토큰화되는 것.
읽기 전용—상속 뒤의 유효 설정.
읽기 전용—상속 뒤의 유효 설정.
읽기 전용—상속 뒤의 유효 설정.
읽기 전용—상속 뒤의 유효 설정.
읽기 전용—상속 뒤의 유효 설정.
읽기 전용—토큰 줄
읽기 전용—줄 수
읽기 전용—강조 줄 번호.
real (읽기 전용)21줄 높이
real (읽기 전용)—거터 폭(줄 번호가 없으면 0).

메서드

메서드설명
사용자 동작으로 expanded를 뒤집음.
사용자 동작으로 expanded를 설정(lastExpandSource = "user").
자식에서 렌더와 스크립트를 다시 찾음(자동으로 호출됨).
resolvedCode를 클립보드에 복사하고 copied를 냄.

시그널

시그널인자시점
detail: { hasRender, hasScript }완료와 첫 부품 수집 뒤 한 번.
—사용자가(lastExpandSource === "user") 또는 바인딩 / 대입이("prop") expanded를 바꿈.
—속성 자체의 시그널.
—속성 자체의 시그널.
detail: { line }줄 번호가 클릭됨(showLineNumbers 필요). 1부터 셈.
detail: { code, language }복사 버튼이나 copy()가 글자를 클립보드에 놓음.
—code 속성이 바뀜.

동작

항목동작 / 조건
codeRender === true인 아이템은 render가 되어 위쪽 영역에 부모가 바뀌고, codeScript === true인 아이템은 script가 되어 아래 영역으로 갑니다.
codeRender === true인 아이템은 render가 되어 위쪽 영역에 부모가 바뀌고, codeScript === true인 아이템은 script가 되어 아래 영역으로 갑니다.
codeRender === true인 아이템은 render가 되어 위쪽 영역에 부모가 바뀌고, codeScript === true인 아이템은 script가 되어 아래 영역으로 갑니다.
codeRender === true인 아이템은 render가 되어 위쪽 영역에 부모가 바뀌고, codeScript === true인 아이템은 script가 되어 아래 영역으로 갑니다.
뷰어(뷰어가 설정).
완료와 첫 부품 수집 뒤 한 번.
SyCodeScript.resolvedCode는 자기 code가 비어 있지 않으면 그것, 아니면 소유 렌더의 source, 아니면 ""입니다. 버튼 — 또는 copy() — 은 숨겨진 텍스트 편집기를 통해 resolvedCode를 시스템 클립보드에 놓고 copied를 냅니다.
보일 글자. 뷰어 안에서 "" = 렌더의 source.
짝이 되는 스크립트가 자기 code가 비어 있을 때 보이는 코드 글자.
resolvedLanguage는 자기 language, 아니면 뷰어의 것, 아니면 "plaintext"입니다.
토크나이저 id 또는 별칭. "" = 뷰어의 것, 아니면 평문.
바의 글자.
두 부품이 모두 있을 때 *SOURCE* 바를 보임.
사용자 동작으로 expanded를 뒤집음.
바 아래에 스크립트를 보일지. 바가 없으면 무시.
expanded의 초기값.
사용자 동작으로 expanded를 설정(lastExpandSource = "user").
사용자가(lastExpandSource === "user") 또는 바인딩 / 대입이("prop") expanded를 바꿈.
사용자 토글의 expandedChanged 핸들러가 도는 동안 "user", 그 외 "prop".
"3,5-7" — 물들일 줄과 범위, 1부터 셈(상속).
스크립트의 거터(상속).
줄 번호가 클릭됨(showLineNumbers 필요). 1부터 셈.
긴 줄은 wrap이 아니면 가로로 스크롤되고, scriptHeight > 0이면 패널이 그 높이로 제한되어 세로로 스크롤됩니다.
긴 줄은 wrap이 아니면 가로로 스크롤되고, scriptHeight > 0이면 패널이 그 높이로 제한되어 세로로 스크롤됩니다.
resolvedCode를 클립보드에 복사하고 copied를 냄.
복사 버튼이나 copy()가 글자를 클립보드에 놓음.
뷰어의 implicitWidth는 480이고 implicitHeight는 렌더 + 바 + 스크립트(보일 때) + 테두리 2 px입니다.
뷰어의 implicitWidth는 480이고 implicitHeight는 렌더 + 바 + 스크립트(보일 때) + 테두리 2 px입니다.
스크립트 높이를 px로 제한하고 나머지를 스크롤. 0 = 제한 없음(상속).

키보드

항목동작 / 조건
SyButton(복사 버튼), SyIcon / Icons.editorCopy, Theme.editor(토큰 팔레트).