한국어
Qt
 

Loader를 사용하여 실행 성능 높이기

 

파싱 할 QML이 많으면 QML 애플리케이션이 느리게 시작될 수 있다. 이는 전체 애플리케이션이 하나의 거대한 QML 파일로 구현 된 경우 발생할 수 있다. 애플리케이션을 최대한 빨리 시작하려면 애플리케이션 시작 시 최소한의 QML을 로드하고 또 요청에 의해서만 UI 를 로드해야 한다.

 

즉, 애플리케이션 UI를 논리적 단위로 작게 분할하고, 시작 시에는 최소 QML 파일만, 불시에 필요에 따라 QML 파일을 로드한다. 

 

QML에는 QML 파일에 정의 된 시각적 QML 구성 요소 또는 QML 파일에 정의 된 아이템/구성 요소를 동적으로 로드 및 언로드 하는데 사용되는  Loader 요소가 있다.

 

아래 예제는 Loader아이템을 사용하여 동적으로 QML파일을 로드하는 방법을 보여준다.

import QtQuick 2.0

Item {
    width: 200; height: 200
    
    Loader { id: pageLoader }
    
    MouseArea {
        anchors.fill: parent
        onClicked: pageLoader.source = "Page1.qml"
    }
}

 

Page1.qml의 모든 새 콘텐츠를 Loader가 있는 현재 위치로 로드한다. 주목할 부분은 source 속성 유형이 URL이라는 것이다.

 

리소스 파일 (qrc://) 또는 로컬 파일 (file://)을 참조하는 데 사용할 수 있지만 웹에 있는 파일 (http(s)://)을 로드하는 데도 사용할 수도 있다. 이 경우 다음과 같을 수 있다.

import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 2.0

Window {
    width: 400
    height: 300
    visible: true

    property url qmlURL: "https://makersweb.net/helloMakersweb.qml"

    Loader {
        id: loader
        source: appUrl
        anchors.fill: parent
    }

    Button {
        text: "Reload"
        onClicked: {
            loader.source = ""
            loader.source = qmlURL
        }
    }
}

 

이러한 동적 생성을 통해 개발자는 애플리케이션의 메모리 사용량과 시작 속도를 제어 할 수 있는 장점이 있다. 대신 화면(View) 사이를 탐색하는 데 어느 정도 ― QML 크기에 따라 ― 의 시간이 필요할 수 있다.

 

어쩔 수 없이 화면(View)이 복잡하고 덩치 큰 QML을 로드해야하는 경우 스플래시 화면 또는 BusyIndicator를 표시하여 사용자에게 어떤 일이 일어나고 있다는 느낌을 줄 수 있다.

Loader {
    id: loader
    asynchronous: true
    anchors.fill: parent
    source: screens[currentIndex]
}

BusyIndicator {
    anchors.centerIn: parent
    running: loader.status == Loader.Loading
    visible: running
}

 

번호 제목 글쓴이 날짜 조회 수
공지 Qt프로그래밍(QtQuick) Beginner를 위한 글 읽는 순서 운영자 2019.01.05 85893
99 Qml 어플리케이션 정적 빌드 file makersweb 2018.07.27 2136
98 [Qt News] Qt 6 기술 비전 (Technical vision for Qt 6) [2] j2doll 2019.08.08 2114
97 ShaderEffect QML Type 을 이용한 그래픽효과 file makersweb 2018.12.09 2113
96 Qt로 데이터를 직렬화(serialization)하는 방법 makersweb 2020.08.04 2055
95 MCU용 Qt에 대해서 makersweb 2019.08.22 1914
94 GPU가 없는 장치에서 Qt Quick을 사용 makersweb 2019.04.02 1857
» Loader를 사용하여 동적으로 QML 로드 makersweb 2021.01.19 1811
92 소스코드에서 환경변수 가져오기와 설정하기 makersweb 2018.10.08 1804
91 Qt Property(속성) 시스템 makersweb 2023.01.08 1775
90 QSocketNotifier로 파일 디스크립터의 활동감지 makersweb 2019.08.28 1731
89 라즈베리파이3에서 Boot to Qt 실행해보기 makersweb 2019.11.13 1668
88 컨테이너에 적재된 객체를 편리하게 삭제하기 makersweb 2019.09.18 1665
87 Qt MQTT의 pus/sub 튜토리얼 file makersweb 2021.02.06 1639
86 [Qt News] Qt for Python을 위한 기술 비전 j2doll 2019.08.20 1626
85 타임스탬프( timestamp) 유닉스 시간 makersweb 2017.10.19 1621
84 VTK 를 사용해서 강력한 시각화(3D, Plotting, Chart)Qt 응용프로그램 개발하기 file makersweb 2022.10.16 1605
83 표를 만들고 PDF문서로 출력하기 file makersweb 2018.09.30 1603
82 Qt for Embedded Linux 화면출력 makersweb 2019.10.17 1599
81 QRandomGenerator 클래스를 사용하여 난수(random values) 생성 makersweb 2020.10.17 1570
80 ApplicationWindow 와 메뉴바(MenuBar)구성 file makersweb 2020.01.04 1499