본문 바로가기
Development Solutions/Qt & QML

QML Optimization Method 1 - Load components dynamically using Loader (QML 최적화 방법1 - Loader를 사용하여 동적으로 컴포넌트 로드하기)

by Dev Diary Hub 2024. 7. 4.
반응형

QML 최적화 방법1 - Loader를 사용하여 동적으로 컴포넌트 로드하기

QML Optimization Method 1 - Load components dynamically using Loader

(추천) Qt QML과 C++로 시작하는 크로스플랫폼 앱 개발 강의 - 입문편

https://inf.run/3XmSH

 

[입문] Qt QML과 C++로 시작하는 크로스플랫폼 앱 개발 강의 | 코드브릿지 - 인프런

코드브릿지 | Qt QML과 C++를 사용하여 크로스플랫폼 애플리케이션 개발에 입문할 수 있습니다. 해당 강의에서는 윈도우 응용 프로그램 타겟으로 개발을 진행합니다., [사진] 강의 주제 📖 이 강의

www.inflearn.com

 

 

loader를 사용하여 동적으로 컴포넌트 로드하기



qt에서 loader를 사용하면 컴포넌트를 동적으로 로드하고 관리할 수 있습니다. 이는 애플리케이션의 성능을 최적화하거나 메모리 사용량을 줄이는데 유용합니다. 특히, 여러 컴포넌트를 한 번에 로드하지 않고 필요한 시점에 로드하여 사용합니다.



원리 설명



loader는 주어진 qml 파일이나 컴포넌트를 필요할 때 로드하고, 이를 제거할 수도 있습니다. 이를 통해 메모리 사용을 최적화하고 애플리케이션의 초기 로딩 시간을 단축할 수 있습니다.



기본 사용법



loader는 다음과 같은 형태로 사용됩니다:

loader {
    id: myloader
    source: "mycomponent.qml"
}



loader는 기본적으로 비활성화 상태입니다. source 프로퍼티에 qml 파일 경로를 설정하고 loader의 active 프로퍼티를 true로 설정하면 컴포넌트가 로드됩니다.



예제 코드

반응형



stacklayout을 사용하여 동적으로 컴포넌트를 로드하는 예제와 각 인스턴스의 프로퍼티 바인딩에 대해 설명합니다.



예제 1: 기본 loader 사용

먼저, 간단한 두 개의 컴포넌트를 만듭니다: component1.qml과 component2.qml.

component1.qml

import qtquick 2.15

rectangle {
    width: 100
    height: 100
    color: "red"
    text {
        anchors.centerin: parent
        text: "component 1"
        color: "white"
    }
}
```

component2.qml
```qml
import qtquick 2.15

rectangle {
    width: 100
    height: 100
    color: "blue"
    text {
        anchors.centerin: parent
        text: "component 2"
        color: "white"
    }
}



main.qml

import qtquick 2.15
import qtquick.controls 2.15

applicationwindow {
    visible: true
    width: 400
    height: 400

    column {
        anchors.centerin: parent
        spacing: 10

        button {
            text: "load component 1"
            onclicked: {
                myloader.source = "component1.qml"
                myloader.active = true
            }
        }

        button {
            text: "load component 2"
            onclicked: {
                myloader.source = "component2.qml"
                myloader.active = true
            }
        }

        loader {
            id: myloader
        }
    }
}



이 예제에서는 두 개의 버튼을 사용하여 loader에 다른 컴포넌트를 동적으로 로드합니다.

예제 2: stacklayout과 loader 사용

main.qml

import qtquick 2.15
import qtquick.controls 2.15
import qtquick.layouts 1.15

applicationwindow {
    visible: true
    width: 400
    height: 400

    stacklayout {
        id: stacklayout
        anchors.fill: parent

        loader {
            id: pageloader
            sourcecomponent: page1component
        }
    }

    component {
        id: page1component
        rectangle {
            width: 400
            height: 400
            color: "green"
            text {
                anchors.centerin: parent
                text: "page 1"
                color: "white"
            }
        }
    }

    component {
        id: page2component
        rectangle {
            width: 400
            height: 400
            color: "yellow"
            text {
                anchors.centerin: parent
                text: "page 2"
                color: "black"
            }
        }
    }

    button {
        text: "switch to page 2"
        anchors.bottom: parent.bottom
        anchors.horizontalcenter: parent.horizontalcenter
        onclicked: {
            pageloader.sourcecomponent = page2component
        }
    }
}

 

프로퍼티 바인딩 주의사항



loader를 통해 동적으로 생성된 인스턴스의 프로퍼티는 바인딩이 깨질 수 있으므로 주의가 필요합니다. 예를 들어, 동적으로 생성된 컴포넌트의 프로퍼티가 부모의 프로퍼티에 바인딩되어 있는 경우, 부모 프로퍼티가 변경되었을 때 바인딩이 유지되지 않을 수 있습니다.

예제: 프로퍼티 바인딩



main.qml

import qtquick 2.15
import qtquick.controls 2.15

applicationwindow {
    visible: true
    width: 400
    height: 400

    property color dynamiccolor: "lightblue"

    column {
        anchors.centerin: parent
        spacing: 10

        button {
            text: "change color"
            onclicked: {
                dynamiccolor = dynamiccolor === "lightblue" ? "lightcoral" : "lightblue"
            }
        }

        loader {
            id: dynamicloader
            sourcecomponent: dynamiccomponent
        }
    }

    component {
        id: dynamiccomponent
        rectangle {
            width: 100
            height: 100
            color: dynamiccolor
            text {
                anchors.centerin: parent
                text: "dynamic color"
                color: "white"
            }
        }
    }
}



이 예제에서 dynamiccomponent는 dynamiccolor 프로퍼티에 바인딩되어 있습니다. dynamiccolor가 변경될 때, dynamiccomponent의 색상도 함께 변경되도록 의도했습니다. 

그러나, loader를 통해 동적으로 로드된 경우, 바인딩이 깨질 수 있습니다. 이 문제를 방지하려면 component.onCompleted 시그널을 사용하여 동적으로 생성된 인스턴스의 프로퍼티를 다시 바인딩해야 할 수 있습니다.



결론



qt의 loader는 동적으로 컴포넌트를 로드하는 강력한 도구입니다. 이를 통해 메모리 사용을 최적화하고 애플리케이션의 초기 로딩 시간을 줄일 수 있습니다. 그러나 동적으로 로드된 인스턴스의 프로퍼티 바인딩에 주의해야 하며, 필요할 경우 바인딩을 다시 설정해주는 것이 중요합니다.

(추천) [초급] 6가지 프로젝트로 다지는 Qt 사용법 (+REST API)

https://inf.run/vLaL3

 

[초급] 6가지 프로젝트로 다지는 Qt 사용법 (REST API) 강의 | 코드브릿지 - 인프런

코드브릿지 | 6가지 프로젝트로 다지는 Qt QML과 C++ 실전 강의입니다. 다양한 형태의 UI 개발과 REST API 통신까지 아우르는 연습을 통해 실무 기본기를 닦아보세요!, 코딩테스트에만 쓰는 C++😂 다양

www.inflearn.com

 

반응형