개요 - QML과 C++ 통합

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

QML과 C++의 통합은 다음과 같은 다양한 기회를 제공합니다:

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

일부 C++ 데이터나 기능을 QML에 제공하려면 QObject 파생 클래스에서 사용할 수 있도록 해야 합니다. QML 엔진이 메타 객체 시스템과 통합되어 있기 때문에 QObject- 파생 클래스의 속성, 메서드 및 신호는 C++ 타입의 속성을 QML에 노출하기에서 설명한 대로 QML에서 액세스할 수 있습니다. 이러한 클래스에서 필요한 기능이 제공되면 다양한 방법으로 QML에 노출할 수 있습니다:

  • 클래스를 인스턴스화 가능한 QML 유형으로 등록하여 QML 코드에서 일반 QML 객체 유형처럼 인스턴스화하여 사용할 수 있습니다.
  • 클래스를 싱글톤 타입으로 등록하여 QML 코드에서 클래스의 단일 인스턴스를 가져올 수 있으므로 인스턴스의 속성, 메서드 및 시그널을 QML에서 액세스할 수 있습니다.
  • 클래스의 인스턴스를 컨텍스트 속성 또는 컨텍스트 객체로 QML 코드에 임베드하여 QML에서 인스턴스의 속성, 메서드 및 시그널에 액세스할 수 있습니다.

이는 QML 코드에서 C++ 기능에 액세스하는 가장 일반적인 방법이며, 더 많은 옵션과 자세한 내용은 아래 섹션에 설명된 주요 문서 페이지를 참조하세요. 또한, QML에서 C++ 기능에 액세스하는 기능 외에도 Qt Qml 모듈은 그 반대로 C++ 코드에서 QML 객체를 조작하는 방법도 제공합니다. 자세한 내용은 C++에서 QML 객체와 상호 작용하기를 참조하세요.

일부 상태를 QML에 전역 프로퍼티로 노출하는 것이 바람직한 경우가 많습니다. C++에서 QML로 상태 노출하기에서는 이를 수행하는 방법을 설명합니다.

마지막으로, C++ 코드는 독립형 애플리케이션으로 배포할 것인지 라이브러리로 배포할 것인지에 따라 C++ 애플리케이션 또는 C++ 플러그인에 통합될 수 있습니다. 플러그인을 QML 모듈과 통합한 다음 다른 애플리케이션에서 QML 코드를 가져와 사용할 수 있습니다. 자세한 내용은 C++ 플러그인에서 유형 및 기능 제공하기를 참조하세요.

C++와 QML 간의 올바른 통합 방법 선택하기

상황에 적합한 통합 방법을 빠르게 결정하기 위해 다음 순서도를 사용할 수 있습니다:

플로차트의 매크로에 대한 설명은 C++에서 QML 유형 정의하기 문서를 참조하세요.

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

QML 엔진과 Qt 메타 객체 시스템의 통합으로 인해 QML을 C++에서 쉽게 확장할 수 있습니다. 이러한 통합을 통해 모든 QObject 파생 클래스의 속성, 메서드 및 시그널에 QML에서 액세스할 수 있습니다. 속성을 읽고 수정할 수 있고, 메서드를 JavaScript 표현식에서 호출할 수 있으며, 필요에 따라 시그널 핸들러를 자동으로 생성할 수 있습니다. 또한 QObject- 파생 클래스의 열거 값은 QML에서 액세스할 수 있습니다.

자세한 내용은 C++ 타입의 속성을 QML에 노출하기를 참조하세요.

C++에서 QML 유형 정의하기

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

또한 Qt Qml 모듈은 첨부 프로퍼티 및 기본 프로퍼티와 같은 QML 개념과 통합되는 QML 유형을 정의하는 메커니즘을 제공합니다.

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

컨텍스트 속성을 사용하여 QML에 C++ 객체 임베드하기

컨텍스트 프로퍼티와 컨텍스트 객체를 사용하여 로드된 QML 객체의 컨텍스트(또는 범위)에 C++ 객체와 값을 직접 임베드할 수 있습니다. 이는 QQmlContext 클래스를 통해 이루어집니다. Qt Qml 모듈에서 제공하는 클래스를 통해 가능하며, 이 클래스는 데이터를 QML 컴포넌트의 컨텍스트에 노출하여 C++에서 QML로 데이터를 주입할 수 있도록 합니다.

자세한 내용은 컨텍스트 속성을 사용하여 QML에 C++ 객체 임베드하기를 참조하세요.

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++ 간의 데이터 유형 변환을 참조하십시오.

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