QML 애플리케이션 배포
QML 문서는 QML 런타임에 의해 로드되고 실행됩니다. 여기에는 선언적 UI 엔진과 함께 기본 제공 QML 유형 및 플러그인 모듈이 포함됩니다. QML 런타임은 타사 QML 유형 및 모듈에 대한 액세스도 제공합니다.
QML을 사용하는 애플리케이션은 QML 문서를 실행하기 위해 QML 런타임을 호출해야 합니다. 아래 설명된 대로 QQuickView 또는 QQmlEngine 을 생성하여 이를 수행할 수 있습니다. 또한 선언적 UI 패키지에는 .qml
파일을 로드하는 qml
도구가 포함되어 있습니다. 이 도구는 QML 런타임을 로드하기 위해 C++ 애플리케이션을 작성할 필요 없이 QML 코드를 개발하고 테스트하는 데 유용합니다.
다음을 사용하여 애플리케이션 배포 Qt Creator
Qt Creator 는 QML 애플리케이션을 다양한 플랫폼에 배포하고 패키징합니다. 모바일 디바이스의 경우 Qt Creator 에서 애플리케이션을 APK와 같은 각 플랫폼 패키지 형식으로 직접 번들링할 수 있습니다.
대상 플랫폼에서 애플리케이션을 실행할 때 애플리케이션은 QML 라이브러리의 위치에 액세스해야 합니다. qmake를 사용하는 경우 QT_INSTALL_QML
환경 변수가 라이브러리 위치를 가리킵니다. Qt 인스톨러는 <version>
/
<컴파일러>/qml
디렉터리에 QML 라이브러리를 설치합니다.
QML 캐싱
QML 런타임은 QML 문서를 파싱하고 바이트 코드를 생성하여 로드합니다. 대부분의 경우 문서는 마지막으로 로드된 이후 변경되지 않았습니다. 이 로드 프로세스의 속도를 높이기 위해 QML 런타임은 각 QML 문서에 대한 캐시 파일을 유지합니다. 이 캐시 파일에는 컴파일된 바이트 코드와 QML 문서 구조의 바이너리 표현이 포함되어 있습니다. 또한 여러 애플리케이션이 동일한 QML 문서를 사용하는 경우 코드에 필요한 메모리는 애플리케이션 프로세스 간에 공유됩니다. 캐시 파일은 POSIX 호환 운영 체제의 경우 mmap()
시스템 호출을 통해, Windows의 경우 CreateFileMapping()
을 통해 로드되므로 메모리를 크게 절약할 수 있습니다.
변경된 QML 문서를 로드할 때마다 캐시가 자동으로 다시 만들어집니다. 캐시 파일은 QStandardPaths::CacheLocation 의 하위 디렉터리에 "qmlcache"라는 이름으로 위치합니다. 파일 확장자는 QML 문서의 경우 .qmlc
, 가져온 JavaScript 모듈의 경우 .jsc
입니다.
미리 컴파일
컴파일된 QML 문서를 캐시 파일에 자동으로 캐싱하면 애플리케이션 로드 시간이 훨씬 빨라집니다. 그러나 캐시 파일을 처음 생성하는 데는 여전히 시간이 걸릴 수 있으며, 특히 애플리케이션을 처음 시작할 때는 더욱 그렇습니다. 이러한 초기 단계를 피하고 처음부터 더 빠른 시작 시간을 제공하기 위해 Qt의 빌드 시스템을 사용하면 애플리케이션의 C++ 부분을 컴파일할 때 QML 파일의 컴파일 단계를 미리 수행할 수 있습니다.
미리 컴파일하면 QML 문서에 구문 오류가 발생할 경우 파일이 로드될 때 런타임이 아닌 애플리케이션 컴파일 타임에 알림을 받을 수 있다는 장점이 있습니다.
이는 CMake QML 모듈 API를 사용하는 경우 자동으로 발생하며, qmake의 경우 아래 섹션을 참조하세요.
qmake
qmake를 사용할 때 미리 컴파일된 QML 파일로 애플리케이션을 배포하려면 파일과 빌드 시스템을 특정 방식으로 구성해야 합니다:
- 모든 QML 문서(자바스크립트 파일 포함)는 Qt의 리소스 시스템을 통해 리소스로 포함되어야 합니다.
- 애플리케이션은
qrc:///
URL 체계를 통해 QML 문서를 로드해야 합니다. CONFIG+=qtquickcompiler
지시어를 사용하여 미리 컴파일을 활성화할 수 있습니다.
QML 장면으로 프로토타이핑하기
선언적 UI 패키지에는 QML 문서를 로드하고 표시하는 QML Runtime 도구인 qml이 포함되어 있습니다. 이 도구는 애플리케이션 개발 단계에서 QML 런타임을 호출하기 위해 직접 C++ 애플리케이션을 작성하지 않고도 QML 기반 애플리케이션을 프로토타이핑하는 데 유용합니다.
애플리케이션에서 QML Runtime 초기화하기
QML을 사용하는 애플리케이션을 실행하려면 애플리케이션에서 QML 런타임을 호출해야 합니다. 이 작업은 QQmlEngine 을 로드하는 Qt C++ 애플리케이션을 작성하여 수행합니다:
- QQuickView 인스턴스를 통해 QML 파일 로드.
- QQmlEngine 인스턴스를 생성하고 QQmlComponent 을 사용하여 QML 파일을 로드합니다.
QQuickView로 초기화하기
QQuickView 는 QML 파일을 로드할 수 있는 QWindow 기반 클래스입니다. 예를 들어 QML 파일 application.qml
이 있는 경우 다음과 같이 표시됩니다:
import QtQuick Rectangle { width: 100; height: 100; color: "red" }
Qt 애플리케이션의 main.cpp
파일에 다음과 같이 로드할 수 있습니다:
#include <QGuiApplication> #include <QQuickView> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQuickView view; view.setSource(QUrl::fromLocalFile("application.qml")); view.show(); return app.exec(); }
그러면 application.qml
의 내용을 표시하는 QWindow 기반 뷰가 생성됩니다.
빌드 파일
qmake#tab-qmakefind_package()
명령을 사용하여 Qt6
패키지에서 필요한 모듈 컴포넌트를 찾습니다:
find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
자세한 내용은 CMake로 빌드 개요를 참조하세요.
QQmlEngine 직접 만들기
application.qml
에 그래픽 컴포넌트가 없거나 다른 이유로 QQuickView 을 사용하지 않으려는 경우 QQmlEngine 을 직접 생성할 수 있습니다. 이 경우 application.qml
는 뷰에 배치되지 않고 QQmlComponent 인스턴스로 로드됩니다:
#include <QGuiApplication> #include <QQmlEngine> #include <QQmlContext> #include <QQmlComponent> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlEngine engine; QQmlContext *objectContext = new QQmlContext(engine.rootContext()); QQmlComponent component(&engine, "application.qml"); QObject *object = component.create(objectContext); // ... delete object and objectContext when necessary return app.exec(); }
Qt Quick 의 그래픽 항목을 사용하지 않는 경우 위 코드에서 QGuiApplication 을 QCoreApplication 으로 대체할 수 있습니다. 이렇게 하면 QML을 언어로서 사용할 때 Qt GUI 모듈에 종속되지 않습니다.
Qt 리소스 시스템을 QML과 함께 사용하기
Qt 리소스 시스템을 사용하면 리소스 파일을 애플리케이션 실행 파일에 바이너리 파일로 저장할 수 있습니다. Qt 리소스 시스템은 파일 시스템 리소스에 대한 상대 경로나 절대 경로가 아닌 리소스 시스템 URI 체계를 통해 QML 파일과 이미지 및 사운드 파일과 같은 기타 리소스를 참조할 수 있으므로 QML 애플리케이션에 사용됩니다.
참고: 리소스 시스템을 사용한다는 것은 일반적으로 QML 소스 파일이 변경될 때마다 애플리케이션 실행 파일을 다시 컴파일하여 패키지의 리소스를 업데이트해야 한다는 것을 의미합니다.
CMake QML 모듈 API는 리소스 시스템에 QML 파일을 자동으로 배치합니다. 리소스에 액세스하려면 기본 QML 파일을 리소스로 로드하거나 qrc
스키마가 있는 URL로 로드합니다. 리소스 시스템에서 QML 파일이 배치된 경로는 연결하여 찾을 수 있습니다:
- qt_add_qml_module에 전달한
RESOURCE_PREFIX
. /qt/qml
RESOURCE_PREFIX
을 전달하지 않았고 QTP0001 정책이 으로 설정되어 있는 경우.NEW
/
RESOURCE_PREFIX
을 전달하지 않았고 QTP0001 정책이 으로 설정된 경우 으로 설정됩니다.not
NEW
NO_RESOURCE_TARGET_PATH
을 qt_add_qml_module에 전달하지 않은 경우: qt_add_qml_module에 전달한URI
은 점을 슬래시로 대체합니다.
예를 들어 My.Own.Module
이라는 모듈이 배치됩니다:
:/qt/qml/My/Own/Module/
/qt/qml
을RESOURCE_PREFIX
으로 지정했거나RESOURCE_PREFIX
을 전달하지 않았고 QTP0001 정책이NEW
으로 설정되어 있는 경우.:/My/Own/Module/
/
을RESOURCE_PREFIX
으로 지정했거나RESOURCE_PREFIX
을 전달하지 않았고 QTP0001 정책이NEW
으로 설정되지 않은 경우. }:/Some/Prefix/My/Own/Module/
Some/Prefix/
로 지정한 경우RESOURCE_PREFIX
:/
로 지정한 경우NO_RESOURCE_TARGET_PATH
이 작업이 완료되면 QML에서 상대 경로로 지정된 모든 파일이 리소스 시스템에서 로드됩니다. 리소스 시스템의 사용은 QML 계층에 완전히 투명하므로 모든 QML 코드는 상대 경로를 사용하여 리소스 파일을 참조해야 하며 qrc
스키마를 사용해서는 안 됩니다. 이 체계는 리소스 파일을 참조할 때 C++ 코드에서만 사용해야 합니다.
참고: qmake를 사용할 때는 리소스 시스템에 파일을 수동으로 배치해야 합니다. 이 방법은 qmake 매뉴얼과 리소스 시스템에 대한 일반 문서를 참조하세요. 그래도 위에 설명된 경로 명명 규칙을 따르는 것이 좋습니다.
관련 정보
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.