티스토리 뷰

개발/QT, QML

QML에서 delegate

부캐: 개발하는 조대리 2024. 11. 21. 14:05
반응형

QML에서 delegate

delegateQML에서 데이터를 어떻게 화면에 표현할지 정의하는 역할을 하는 중요한 요소입니다. 주로 ListView, GridView, Repeater와 같은 컨테이너에서 사용됩니다. delegate는 데이터를 시각적으로 어떻게 표시할지 결정하는 템플릿이라고 생각할 수 있습니다.

 

 

 

 간단한 개념

  • delegate는 데이터를 보여주는 각 항목(Item)이 어떤 모습으로 그려질지를 정의하는 설명서 같은 역할을 합니다.
  • 예를 들어, 리스트 형태의 데이터를 보여줄 때 각 항목을 사각형으로 할지, 텍스트와 이미지로 할지 등을 delegate를 통해 정의합니다.

 

 

 

 delegate의 역할과 예제

delegate는 컨테이너의 각 데이터 항목을 기반으로 해당 데이터가 어떻게 렌더링 될지 정의하는 데 사용됩니다.

기본 예제: ListView와 delegate

다음은 ListView에서 delegate를 사용하여 데이터를 어떻게 화면에 표시하는지 보여주는 간단한 예제입니다.

import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    visible: true
    width: 300
    height: 400

    ListView {
        width: parent.width
        height: parent.height

        // 모델 정의
        model: ListModel {
            ListElement { name: "Alice"; age: 25 }
            ListElement { name: "Bob"; age: 30 }
            ListElement { name: "Charlie"; age: 22 }
        }

        // delegate 정의: 각 데이터 항목을 어떻게 표현할지 정의
        delegate: Rectangle {
            width: parent.width
            height: 50
            border.color: "gray"
            color: "lightblue"

            Row {
                spacing: 10
                anchors.verticalCenter: parent.verticalCenter
                Text { text: "Name: " + model.name }
                Text { text: "Age: " + model.age }
            }
        }
    }
}

설명

  • model: ListModel을 사용하여 데이터를 정의합니다. 여기서는 각각 name과 age 속성을 가진 ListElement를 사용하여 세 사람의 데이터를 나타냅니다.
  • delegate: 각 항목을 어떻게 표현할지 정의합니다. 이 예제에서는 각 항목을 Rectangle로 표현하고, 이름과 나이를 Text 요소로 표시하고 있습니다.
  • Row: 텍스트를 가로로 나란히 정렬하기 위해 Row 레이아웃을 사용했습니다.

 

 

 

 delegate의 주요 속성 및 특징

  • 동적으로 항목 생성: delegate는 model의 각 데이터 항목마다 동적으로 UI 요소를 생성합니다. 예를 들어, 모델에 5개의 항목이 있으면 delegate는 그에 맞춰 5개의 UI 항목을 생성합니다.
  • 데이터 바인딩: model의 각 항목 데이터는 delegate 내부에서 자동으로 바인딩됩니다. model.name이나 model.age와 같은 형식으로 데이터를 사용할 수 있습니다.
  • 동적 UI: 데이터 모델이 변경되면 delegate에 의해 자동으로 UI가 업데이트되므로, 실시간으로 변하는 데이터를 표현하는 데 적합합니다.

 

 

 

 다양한 컨테이너에서 delegate 사용

delegate는 ListView 외에도 다양한 컨테이너에서 사용됩니다. 예를 들어, GridViewRepeater와 같은 다른 컨테이너에서도 delegate를 사용하여 데이터를 표현할 수 있습니다.

예제: GridView에서의 delegate 사용

import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    visible: true
    width: 400
    height: 400

    GridView {
        width: parent.width
        height: parent.height
        cellWidth: 100
        cellHeight: 100

        model: ListModel {
            ListElement { name: "Apple"; color: "red" }
            ListElement { name: "Banana"; color: "yellow" }
            ListElement { name: "Cherry"; color: "darkred" }
        }

        delegate: Rectangle {
            width: 90
            height: 90
            color: model.color
            border.color: "black"

            Text {
                anchors.centerIn: parent
                text: model.name
            }
        }
    }
}

설명

  • GridView: 데이터를 격자(grid) 형태로 표시하는 컨테이너입니다.
  • delegate: 각 항목을 Rectangle로 표현하고, 색상과 이름을 model의 데이터로 바인딩합니다.
  • cellWidth와 cellHeight: 각 셀의 크기를 설정하여 GridView에서 항목의 크기를 지정합니다.

 

 

 

 delegate를 사용한 사용자 상호작용 처리

delegate는 단순히 데이터를 화면에 표시하는 역할뿐만 아니라 사용자와의 상호작용을 처리할 수 있습니다. 각 항목에 MouseArea를 추가하여 클릭 시 특정 동작을 수행하도록 만들 수 있습니다.

예제: 항목 클릭 처리

import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    visible: true
    width: 300
    height: 400

    ListView {
        width: parent.width
        height: parent.height

        model: ListModel {
            ListElement { name: "Alice"; age: 25 }
            ListElement { name: "Bob"; age: 30 }
        }

        delegate: Rectangle {
            width: parent.width
            height: 50
            border.color: "gray"
            color: "lightblue"

            Row {
                spacing: 10
                anchors.verticalCenter: parent.verticalCenter
                Text { text: "Name: " + model.name }
                Text { text: "Age: " + model.age }
            }

            MouseArea {
                anchors.fill: parent
                onClicked: {
                    console.log("Clicked on: " + model.name + ", Age: " + model.age)
                }
            }
        }
    }
}

설명

  • MouseArea: 각 항목에 대한 클릭 이벤트를 처리할 수 있도록 추가했습니다. 사용자가 항목을 클릭하면 콘솔에 항목의 정보를 출력합니다.
  • 이를 통해 각 항목이 동적으로 이벤트를 처리할 수 있습니다.

 

 

 

 정리

  • delegate데이터를 시각적으로 어떻게 표현할지 정의하는 역할을 합니다.
  • ListView, GridView, Repeater 등 다양한 컨테이너에서 사용됩니다.
  • delegate는 데이터와 UI의 연결을 담당하며, 데이터 변경 시 UI를 자동으로 업데이트합니다.
  • MouseArea와 같은 요소를 사용해 각 항목에서 사용자 상호작용을 처리할 수 있습니다.

 

 

delegate를 잘 활용하면 데이터를 직관적이고 효율적으로 시각화할 수 있으며, 사용자의 입력에 반응하는 동적인 인터페이스를 쉽게 만들 수 있습니다. QML의 데이터 바인딩과 결합하면 매우 강력한 UI 설계가 가능해집니다. 😊

 

 


 

 

개인적으로 학습하면서 정리한 내용입니다.
잘못된 내용이 있을 경우 알려주시면 확인 후 수정 및 반영하도록 하겠습니다.

오늘도 감사합니다.(__)