이 페이지에서

개요 - QML과 C++의 통합

QML은 C++ 코드를 통해 쉽게 확장될 수 있도록 설계되었습니다. Qt Qml 모듈의 클래스를 통해 C++에서 QML 객체를 불러오고 조작할 수 있으며, QML 엔진이 Qt의 메타 객체 시스템과 통합된 특성 덕분에 C++ 기능을 QML에서 직접 호출할 수 있습니다. 이를 통해 QML, JavaScript 및 C++ 코드를 혼합하여 구현된 하이브리드 애플리케이션을 개발할 수 있습니다.

QML과 C++을 통합하면 다음과 같은 다양한 이점을 얻을 수 있습니다:

  • 사용자 인터페이스 코드를 QML 문서 내에서 QML 및 JavaScript로 구현하고, 애플리케이션 로직 코드를 C++로 구현함으로써 두 코드를 분리할 수 있습니다.
  • QML에서 일부 C++ 기능을 사용하고 호출할 수 있습니다(예: 애플리케이션 로직을 호출하거나, C++로 구현된 데이터 모델을 사용하거나, 타사 C++ 라이브러리의 함수를 호출하는 경우).
  • 다음의 기능에 접근할 수 있습니다. Qt Qml 또는 Qt Quick C++ API의 기능에 접근할 수 있습니다(예: ` QQuickImageProvider`를 사용하여 이미지를 동적으로 생성하는 경우)
  • C++에서 자체 QML 객체 유형을 구현합니다. 이는 특정 애플리케이션 내에서 사용하거나 다른 사용자에게 배포하기 위한 목적일 수 있습니다.

QML에 C++ 데이터나 기능을 제공하려면, QObject 에서 파생된 클래스를 통해 이를 사용할 수 있도록 해야 합니다. QML 엔진이 메타 객체 시스템과 통합되어 있기 때문에, “C++ 유형의 속성을 QML에 노출하기”에 설명된 대로, QObject 에서 파생된 모든 클래스의 속성, 메서드 및 신호에 QML에서 접근할 수 있습니다. 이러한 클래스가 필요한 기능을 제공하면, 다양한 방법으로 QML에 노출할 수 있습니다.

이것들은 QML 코드에서 C++ 기능에 접근하는 가장 일반적인 방법입니다. ` QML Type Registration Macros `는 그 외에도 다양한 옵션과 변형을 제공합니다. 또한, QML에서 C++ 기능에 접근하는 기능 외에도, Qt Qml 이 모듈은 그 반대의 경우, 즉 C++ 코드에서 QML 객체를 조작할 수 있는 방법도 제공합니다. 자세한 내용은 'C++에서 QML 객체와 상호작용하기'를 참조하십시오.

때로는 특정 상태를 전역 속성으로 QML에 노출하는 것이 바람직할 수 있습니다. ‘C++에서 QML로 상태 노출’에서는 이를 수행하는 방법을 설명합니다.

C++ 코드는 독립 실행형 애플리케이션으로 배포할지, 아니면 라이브러리로 배포할지에 따라 C++ 애플리케이션이나 독립 실행형 QML 모듈 중 하나에 통합될 수 있습니다. QML 모듈에는 QML 엔진에 의해 동적으로 로드될 수 있는 C++ 플러그인이 포함될 수 있습니다. 이를 통해 애플리케이션은 바이너리에 링크되지 않은 QML 모듈을 사용할 수 있습니다.

수동으로 독립형 플러그인을 생성할 수도 있습니다. 자세한 내용은 ‘C++ 플러그인에서 유형 및 기능 제공’을 참조하십시오. 단, 이 방법은 권장되지 않습니다.

마지막으로, 클래스의 인스턴스를 컨텍스트 속성(context property ) 또는 컨텍스트 객체(context object)로 QML 코드에 삽입할 수 있으며, 이를 통해 QML에서 해당 인스턴스의 속성, 메서드 및 신호에 접근할 수 있습니다. 컨텍스트 속성은 피하는 것이 좋습니다.

C++과 QML 간의 올바른 통합 방법 선택

자신의 상황에 적합한 통합 방법을 신속하게 파악하려면 다음 흐름도를 활용할 수 있습니다.

흐름도는 사용자가 올바른 통합을 선택하는 데 도움을 줍니다.

흐름도 내 매크로에 대한 설명은 ‘C++에서 QML 유형 정의’ 문서를 참조하십시오.

C++ 클래스의 속성을 QML에 노출하기

Qt Qml 엔진이 Qt 메타 객체 시스템과 통합되어 있으므로, C++을 통해 QML을 쉽게 확장할 수 있습니다. 이러한 통합 덕분에 ` QObject`에서 파생된 모든 클래스의 속성, 메서드 및 신호에 QML에서 접근할 수 있습니다. 속성은 읽거나 수정할 수 있고, 메서드는 JavaScript 표현식을 통해 호출할 수 있으며, 필요한 경우 신호에 대한 신호 핸들러가 자동으로 생성됩니다. 또한, ` QObject`에서 파생된 클래스의 열거형 값도 QML에서 접근할 수 있습니다.

자세한 내용은 ‘C++ 유형의 속성을 QML에 노출하기’를 참조하십시오.

C++에서 QML 유형 정의

QML 유형은 C++에서 정의한 다음 QML 유형 시스템에 등록할 수 있습니다. 이를 통해 C++ 클래스를 QML 객체 유형으로 인스턴스화할 수 있으므로, C++에서 사용자 정의 객체 유형을 구현하고 기존 QML 코드에 통합할 수 있습니다. C++ 클래스는 다른 목적으로도 등록될 수 있습니다. 예를 들어, QML 코드에서 단일 클래스 인스턴스를 가져올 수 있도록 싱글톤 유형으로 등록하거나, 인스턴스화할 수 없는 클래스의 열거형 값에 QML에서 접근할 수 있도록 등록할 수 있습니다.

또한, Qt Qml 이 모듈은 부착 속성(attached properties) 및 기본 속성(default properties)과 같은 QML 개념과 통합되는 QML 유형을 정의할 수 있는 메커니즘을 제공합니다.

C++에서 사용자 정의 QML 유형을 등록하고 생성하는 방법에 대한 자세한 내용은 C++에서 QML 유형 정의 문서를 참조하십시오.

컨텍스트 속성을 사용하여 QML에 C++ 객체 삽입

QQmlContext C++ 객체와 값은 컨텍스트 속성 및 컨텍스트 객체를 사용하여 로드된 QML 객체의 컨텍스트(또는 범위)에 직접 포함될 수 있습니다. 이는 Qt Qml 이 클래스는 QML 컴포넌트의 컨텍스트에 데이터를 노출하여, C++에서 QML로 데이터를 주입할 수 있게 해줍니다.

자세한 내용은 ‘컨텍스트 속성을 사용하여 C++ 객체를 QML에 삽입하기’를 참조하십시오.

C++에서 QML 객체와 상호 작용하기

QML 객체 유형은 C++에서 인스턴스화하여 검사함으로써, 해당 객체의 속성에 접근하고, 메서드를 호출하며, 신호 알림을 수신할 수 있습니다. 이는 모든 QML 객체 유형이 ` QObject`에서 파생된 클래스를 사용하여 구현되어, QML 엔진이 Qt 메타 객체 시스템을 통해 객체를 동적으로 로드하고 내부 구조를 분석할 수 있게 하기 때문입니다.

경고: C++에서 QML 객체에 접근하여 조작하는 것은가능하지만 , 테스트 및 프로토타이핑 목적을 제외하고는 권장되는 방식이 아닙니다. QML과 C++ 통합의 강점 중 하나는 C++ 로직 및 데이터셋 백엔드와 분리된 상태로 QML에서 UI를 구현할 수 있다는 점인데, C++ 측에서 QML을 직접 조작하기 시작하면 이러한 장점은 무효화됩니다. 또한 이러한 방식은 C++ 측에 영향을 주지 않고 QML UI를 변경하기 어렵게 만듭니다.

C++에서 QML 객체에 액세스하는 방법에 대한 자세한 내용은 ‘C++에서 QML 객체와 상호 작용하기’ 문서와 ‘모범 사례’ 페이지의 ‘C++에서 QML로 데이터 노출’ 섹션을 참조하십시오.

QML과 C++ 간의 데이터 유형 변환

QML과 C++ 간에 데이터 값이 교환될 때, 해당 데이터 유형이 엔진에 알려져 있는 경우 QML 엔진은 QML 또는 C++에서 사용하기에 적합한 올바른 데이터 유형으로 변환합니다.

엔진이 지원하는 내장 유형과 QML과 C++ 간 교환 시 이러한 유형이 어떻게 변환되는지에 대한 정보는 ‘QML과 C++ 간의 데이터 유형 변환’을 참조하십시오.

© 2026 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.