티스토리 뷰

목차

    반응형

    [Qt프로그래밍] QML Repeater 리피터 예제


    Qt프로그래밍 QML 리피터(QML Repeaters) :  모델 데이터를 이용해 사용자가 정의한 템플릿 위에 아이템을 배치.


    QML 리피터를 이용하면 사용자가 원하는 위치에 많은 요소를 쉽게 배치할 수 있다. QML 리피터가 생성하여 배치할 아이템의 총 개수는 내부의 model 값으로 결정된다.


    여기서 소개할 샘플은 24개 도형을 5 by 5 크기로 생성한다. 반복 횟수는 model이 보유한 24이다. QML Repeater 내부의 Rectangle 생성 코드를 24번 반복하니, 총 24개의 도형이 생성된다는 뜻이다. 또한, 도형에는 텍스트가 추가된다.


    즉, 도형엔 생성 순서별 번호가 쓰이는 것이다.


    1
    2
    3
    4
    5
    for (int i = 0; i < 100; i++)
    {
        ...
        ...
    }
    cs


    이런 코드가 있을 때, 저 i를 쓴다. 아래 예제 코드를 실행시켜 먼저 결과를 확인하자.


    QML Repeaters 예제 - 5 by 5 도형[ListView] 리스트뷰 예제

    수정 전 기본 소스


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    import QtQuick 2.5
    import QtQuick.Window 2.2
     
    Window {
        visible: true
        width: 400
        height: 400
     
        Rectangle {
            width: 400; height: 400; color: "black"
     
            Grid {
                x: 5;
                y: 5
     
                rows: 5;
                columns: 5;
                spacing: 10
     
                Repeater { model: 24
                    Rectangle { width: 70; height: 70
                        color: "lightgreen"
     
                        Text { text: index
                            font.pointSize: 30
                            anchors.centerIn: parent }
                    }
                }
            }
        }
    }
    cs


    위 그림처럼 QML Repeater는 5 by 5 형태의 결과 화면을 만든다


    여기서, 예제를 조금 바꿔 도형에 표시되는 텍스트를 교체하자. 도형의 텍스트는 Rectangle 하단의 Text 영역에서 결정된다.


    먼저 Qt프로그래밍 QML Repeater의 model을 아래처럼 수정한다.


    1
    2
    //model: 10
    model: ["KT""두산""NC""삼성""롯데""LG""KIA""한화""넥센""SK"]
    cs


    처음에 선언한 model: 24는 25번 반복이란 의미로 model을 배열 형태로 교체하면 마치 foreach 처럼 작동한다.


    Qt프로그래밍 QML의 확장성과 코드의 유연함을 엿볼 수 있는 부분이기도 하다. 지금 바꾸고자 하는 도형 표시 텍스트가 바로 저 배열의 것이다. 그러려면 기존의 인덱스가 아닌, 인덱스에 해당하는 값을 불러와야 한다.


    아래처럼 코드를 수정하자.


    1
    2
    3
    4
    5
    Text {
        text: modelData
            font.pointSize: 20
            anchors.centerIn: parent 
        }
    cs


    QML modelData란 model 인덱스에 해당하는 값을 불러온다는 의미다.


    수정이 되었다면 다시 실행해보자. 아래처럼 KBO 10개 구단 팀 명이 보인다.


    QML Repeaters 예제 - 10개 구단 팀명 텍스트[ListView] 리스트뷰 예제


    QML model 요소는 외부에 선언된 것으로 대치할 수 있다. QML 리피터 내부에 model을 선언하고 싶지 않다면, 이 내용을 외부로 옮기자.

    Qt프로그래밍 소스를 아래처럼 구성한다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    ListModel {
        id: kbo_model
        ListElement { name: "위즈" }
        ListElement { name: "베어스" }
        ListElement { name: "다이노스" }
        ListElement { name: "라이온즈" }
        ListElement { name: "자이언츠" }
        ListElement { name: "트윈스" }
        ListElement { name: "타이거즈" }
        ListElement { name: "이글수" }
        ListElement { name: "히어로즈" }
        ListElement { name: "와이번스" }
    }
     
    Rectangle {
        width: 400; height: 400; color: "black"
    ...
    ...
    ...
    cs


    Rectangle 상단으로 model 요소를 이동했다. ListModel을 선언하면 편리하게 model의 요소를 관리할 수 있다.


    QML Repeater는 kbo_model이란 id를 참조해 요소들을 사용할 수 있다. 그러니, QML 리피터의 model을 아래처럼 수정하자.


    1
    model: kbo_model
    cs


    다시 실행하면 결과는 아래처럼 바뀐다.


    QML Repeaters 예제 - ListModel 사용[ListView] 리스트뷰 예제


    여기까지, 간단하게 Qt프로그래밍 QML 리피터 사용방법을 살펴보았다.


    반복문은 어디서건 사용되니 Qt프로그래밍 QML Repeters를 미리 알아두는 게 좋다.


    마지막 - 최종 소스


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    import QtQuick 2.5
    import QtQuick.Window 2.2
     
    Window {
        visible: true
        width: 400
        height: 400
     
        ListModel {
            id: kbo_model
            ListElement { name: "위즈" }
            ListElement { name: "베어스" }
            ListElement { name: "다이노스" }
            ListElement { name: "라이온즈" }
            ListElement { name: "자이언츠" }
            ListElement { name: "트윈스" }
            ListElement { name: "타이거즈" }
            ListElement { name: "이글수" }
            ListElement { name: "히어로즈" }
            ListElement { name: "와이번스" }
        }
     
        Rectangle {
            width: 400; height: 400; color: "black"
     
            Grid {
                x: 5;
                y: 5
     
                rows: 5;
                columns: 5;
                spacing: 10
     
                Repeater {
                    //model: 24
                    //model: ["KT", "두산", "NC", "삼성", "롯데", "LG", "KIA", "한화", "넥센", "SK"]
                    model: kbo_model
                    Rectangle { width: 70; height: 70
                        color: "lightgreen"
     
                        Text { text: modelData
                            font.pointSize:10
                            anchors.centerIn: parent
                        }
                    }
                }
            }
        }
    }
    cs


    [Qt프로그래밍] QML Repeater QML 리피터 예제

    반응형