이 페이지에서

QQmlComponent Class

QQmlComponent 클래스는 QML 컴포넌트 정의를 캡슐화합니다. 더 보기...

헤더: #include <QQmlComponent>
CMake: find_package(Qt6 REQUIRED COMPONENTS Qml)
target_link_libraries(mytarget PRIVATE Qt6::Qml)
qmake: QT += qml
QML에서: Component
상속: QObject

공개 유형

enum CompilationMode { PreferSynchronous, Asynchronous }
enum Status { Null, Ready, Loading, Error }

속성

공개 함수

QQmlComponent(QQmlEngine *engine, QObject *parent = nullptr)
QQmlComponent(QQmlEngine *engine, const QString &fileName, QObject *parent = nullptr)
QQmlComponent(QQmlEngine *engine, const QUrl &url, QObject *parent = nullptr)
QQmlComponent(QQmlEngine *engine, const QString &fileName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
QQmlComponent(QQmlEngine *engine, const QUrl &url, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
(since 6.5) QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QObject *parent = nullptr)
(since 6.5) QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
virtual ~QQmlComponent() override
virtual QObject *beginCreate(QQmlContext *context)
virtual void completeCreate()
virtual QObject *create(QQmlContext *context = nullptr)
void create(QQmlIncubator &incubator, QQmlContext *context = nullptr, QQmlContext *forContext = nullptr)
QObject *createWithInitialProperties(const QVariantMap &initialProperties, QQmlContext *context = nullptr)
QQmlContext *creationContext() const
QQmlEngine *engine() const
QList<QQmlError> errors() const
(since 6.5) bool isBound() const
bool isError() const
bool isLoading() const
bool isNull() const
bool isReady() const
qreal progress() const
void setInitialProperties(QObject *object, const QVariantMap &properties)
QQmlComponent::Status status() const
QUrl url() const

공개 슬롯

(since 6.5) void loadFromModule(QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode = PreferSynchronous)
void loadUrl(const QUrl &url)
void loadUrl(const QUrl &url, QQmlComponent::CompilationMode mode)
void setData(const QByteArray &data, const QUrl &url)

신호

void progressChanged(qreal progress)
void statusChanged(QQmlComponent::Status status)

상세 설명

컴포넌트는 명확하게 정의된 인터페이스를 갖춘 재사용 가능한 캡슐화된 QML 유형입니다.

QQmlComponent 인스턴스는 QML 파일에서 생성할 수 있습니다. 예를 들어, 다음과 같은 main.qml 파일이 있다면:

import QtQuick 2.0

Item {
    width: 200
    height: 200
}

다음 코드는 이 QML 파일을 컴포넌트로 불러오고, create()를 사용하여 이 컴포넌트의 인스턴스를 생성한 다음, Item 의 width 값을 조회합니다:

QQmlEngine*engine = new QQmlEngine;
QQmlComponent component(engine, QUrl::fromLocalFile("main.qml"));
if (component.isError()) {
    qWarning() << "Failed to load main.qml:" << component.errors();
   return 1;
}

QObject*myObject = component.create();
if (component.isError()) {
    qWarning() << "Failed to create instance of main.qml:" << component.errors();
   return 1;
}

QQuickItem*item = qobject_cast<QQuickItem*>(myObject);
int width = item->width();  // width = 200

QQmlEngine 인스턴스를 사용할 수 없는 코드에서 컴포넌트의 인스턴스를 생성하려면 qmlContext() 또는 qmlEngine()을 사용할 수 있습니다. 예를 들어, 아래 시나리오에서는 QQuickItem 의 서브클래스 내에서 자식 항목들이 생성되고 있습니다:

void MyCppItem::init()
{
    QQmlEngine *engine = qmlEngine(this);
    // Or:
    // QQmlEngine *engine = qmlContext(this)->engine();
    QQmlComponent component(engine, QUrl::fromLocalFile("MyItem.qml"));
    QQuickItem *childItem = qobject_cast<QQuickItem*>(component.create());
    childItem->setParentItem(this);
}

이러한 함수는 QObject 의 서브클래스 생성자 내에서 호출될 경우, 해당 인스턴스가 아직 컨텍스트나 엔진을 갖지 않았기 때문에 null 를 반환한다는 점에 유의하십시오.

네트워크 구성 요소

QQmlComponent에 전달된 URL이 네트워크 리소스이거나, QML 문서가 네트워크 리소스를 참조하는 경우, QQmlComponent는 객체를 생성하기 전에 네트워크 데이터를 가져와야 합니다. 이 경우, QQmlComponent는 Loading status 상태를 갖게 됩니다. 애플리케이션은 컴포넌트가 Ready 상태가 될 때까지 기다린 후 QQmlComponent::create()를 호출해야 합니다.

다음 예제는 네트워크 리소스에서 QML 파일을 불러오는 방법을 보여줍니다. QQmlComponent를 생성한 후, 컴포넌트가 로딩 중인지 확인합니다. 로딩 중이라면 QQmlComponent::statusChanged() 신호에 연결하고, 그렇지 않은 경우 continueLoading() 메서드를 직접 호출합니다. 컴포넌트가 캐시되어 즉시 사용 가능한 상태인 경우, 네트워크 컴포넌트의 QQmlComponent::isLoading() 값이 false일 수 있다는 점에 유의하십시오.

MyApplication::MyApplication()
{
    // ...
    component = new QQmlComponent(engine, QUrl("http://www.example.com/main.qml"));
    if (component->isLoading()) {
        QObject::connect(component, &QQmlComponent::statusChanged,
                         this, &MyApplication::continueLoading);
    } else {
        continueLoading();
    }
}

void MyApplication::continueLoading()
{
    if (component->isError()) {
        qWarning() << component->errors();
    } else {
        QObject*myObject = component->create();
    }
}

멤버 유형 문서

enum QQmlComponent::CompilationMode

QQmlComponent 가 컴포넌트를 즉시 로드할지, 아니면 비동기적으로 로드할지 지정합니다.

상수값설명
QQmlComponent::PreferSynchronous0스레드를 차단하면서 컴포넌트를 즉시 로드/컴파일하는 것을 우선합니다. 이 방법이 항상 가능한 것은 아닙니다. 예를 들어, 원격 URL은 항상 비동기적으로 로드됩니다.
QQmlComponent::Asynchronous1백그라운드 스레드에서 컴포넌트를 로드/컴파일합니다.

enum QQmlComponent::Status

QQmlComponent 의 로딩 상태를 지정합니다.

상수값설명
QQmlComponent::Null0이 QQmlComponent 에는 데이터가 없습니다. QML 콘텐츠를 추가하려면 loadUrl() 또는 setData()를 호출하십시오.
QQmlComponent::Ready1이 QQmlComponent 는 준비가 완료되었으며, create()를 호출할 수 있습니다.
QQmlComponent::Loading2이 QQmlComponent 는 네트워크 데이터를 불러오고 있습니다.
QQmlComponent::Error3오류가 발생했습니다. errors()을 호출하여 errors 목록을 가져오십시오.

속성 문서

[read-only] progress : qreal

컴포넌트 로딩 진행 상황으로, 0.0(로딩되지 않음)부터 1.0(완료)까지 표시됩니다.

액세스 함수:

qreal progress() const

Notifier 신호:

void progressChanged(qreal progress)

[read-only] status : Status

컴포넌트의 현재 status.

액세스 함수:

QQmlComponent::Status status() const

알림 신호:

void statusChanged(QQmlComponent::Status status)

[read-only] url : const QUrl

컴포넌트 URL입니다. 이 URL은 생성자나 ` loadUrl()` 또는 ` setData()` 메서드 중 하나에 전달되는 URL입니다.

액세스 함수:

QUrl url() const

멤버 함수 설명서

QQmlComponent::QQmlComponent(QQmlEngine *engine, QObject *parent = nullptr)

데이터가 없는 QQmlComponent를 생성하고, 지정된 engine 및 parent 를 전달합니다. setData()를 사용하여 데이터를 설정합니다.

QQmlComponent::QQmlComponent(QQmlEngine *engine, const QString &fileName, QObject *parent = nullptr)

주어진 ` fileName `를 기반으로 `QQmlComponent`를 생성하고, 지정된 ` parent ` 및 ` engine`를 전달합니다.

loadUrl()도 참조하십시오 .

QQmlComponent::QQmlComponent(QQmlEngine *engine, const QUrl &url, QObject *parent = nullptr)

주어진 ` url `를 기반으로 `QQmlComponent`를 생성하고, 지정된 ` parent ` 및 ` engine`을 전달합니다.

제공된 URL이 완전하고 정확한지 확인하십시오. 특히, 로컬 파일 시스템에서 파일을 불러올 때는 QUrl::fromLocalFile()을 사용하십시오.

상대 경로는 QQmlEngine::baseUrl()을 기준으로 해석되며, 별도로 지정되지 않는 한 이는 현재 작업 디렉터리입니다.

loadUrl()도 참조하십시오 .

QQmlComponent::QQmlComponent(QQmlEngine *engine, const QString &fileName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)

주어진 ` fileName `를 기반으로 `QQmlComponent`를 생성하고, 지정된 ` parent ` 및 ` engine`를 전달합니다. ` mode `가 ` Asynchronous`인 경우, 컴포넌트는 비동기적으로 로드 및 컴파일됩니다.

loadUrl()도 참조하십시오 .

QQmlComponent::QQmlComponent(QQmlEngine *engine, const QUrl &url, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)

주어진 ` url `를 기반으로 `QQmlComponent`를 생성하고, 지정된 ` parent ` 및 ` engine`를 전달합니다. ` mode `가 ` Asynchronous`인 경우, 컴포넌트는 비동기적으로 로드 및 컴파일됩니다.

제공된 URL이 완전하고 정확한지 확인하십시오. 특히, 로컬 파일 시스템에서 파일을 불러올 때는 QUrl::fromLocalFile()을 사용하십시오.

상대 경로는 QQmlEngine::baseUrl()을 기준으로 해결되며, 별도로 지정되지 않는 한 이는 현재 작업 디렉터리입니다.

loadUrl()도 참조하십시오 .

[explicit, since 6.5] QQmlComponent::QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QObject *parent = nullptr)

주어진 ` uri ` 및 ` typeName `을 사용하여 `QQmlComponent`를 생성하고, 지정된 ` parent ` 및 ` engine`을 전달합니다. 가능한 경우, 컴포넌트는 동기식으로 로드됩니다.

이 함수는 오버로드된 함수입니다.

이 함수는 Qt 6.5에서 도입되었습니다.

loadFromModule()도 참조하십시오 .

[explicit, since 6.5] QQmlComponent::QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)

주어진 ` uri ` 및 ` typeName `을 사용하여 `QQmlComponent`를 생성하고, 지정된 ` parent ` 및 ` engine`을 전달합니다. ` mode `가 ` Asynchronous`인 경우, 컴포넌트는 비동기적으로 로드 및 컴파일됩니다.

이것은 오버로드된 함수입니다.

이 함수는 Qt 6.5에서 도입되었습니다.

loadFromModule()도 참조하십시오 .

[override virtual noexcept] QQmlComponent::~QQmlComponent()

QQmlComponent 를 파괴하라.

[virtual] QObject *QQmlComponent::beginCreate(QQmlContext *context)

지정된 ` context` 내에서 이 컴포넌트의 객체 인스턴스를 생성합니다. 생성 실패 시 ` nullptr `를 반환합니다.

참고: 이 메서드는 컴포넌트 인스턴스 생성에 대한 고급 제어 기능을 제공합니다. 일반적으로 프로그래머는 QQmlComponent::create()을 사용하여 객체 인스턴스를 생성해야 합니다.

QQmlComponent 가 인스턴스를 생성할 때는 다음 세 단계로 진행됩니다:

  1. 객체 계층 구조가 생성되고 상수 값이 할당됩니다.
  2. 속성 바인딩이 처음 평가됩니다.
  3. 해당되는 경우, 객체에 대해 ` QQmlParserStatus::componentComplete()`가 호출됩니다.

QQmlComponent::beginCreate()는 1단계만 수행한다는 점에서 QQmlComponent::create()과 다릅니다. 2단계와 3단계를 완료하려면 QQmlComponent::completeCreate()를 호출해야 합니다.

이 중단점은 부착된 속성을 사용하여 인스턴스화된 컴포넌트에 정보를 전달할 때 유용할 수 있는데, 속성 바인딩이 적용되기 전에 초기 값을 구성할 수 있게 해주기 때문입니다.

반환된 객체 인스턴스의 소유권은 호출자에게 이전됩니다.

참고: 바인딩을 상수 값과 실제 바인딩으로분류하는 것은 의도적으로 명시되지 않았으며, Qt 버전 간에, 그리고 qmlcachegen을 사용하는지 여부와 사용 방법에 따라 달라질 수 있습니다. beginCreate()가 반환되기 전이나 반환된 후에 특정 바인딩이 평가될 것이라고 가정해서는 안 됩니다. 예를 들어, MyType.EnumValue와 같은 상수 표현식은 컴파일 시점에 상수로 인식되거나 바인딩으로 실행이 지연될 수 있습니다. -(5) 또는 "a" + "상수 문자열"과 같은 상수 표현식도 마찬가지입니다.

completeCreate() 및 QQmlEngine::ObjectOwnership도 참조하십시오 .

[virtual] void QQmlComponent::completeCreate()

이 메서드는 컴포넌트 인스턴스 생성에 대한 정교한 제어를 제공합니다. 일반적으로 프로그래머는 QQmlComponent::create()를 사용하여 컴포넌트를 생성해야 합니다.

이 함수는 QQmlComponent::beginCreate()로 시작된 컴포넌트 생성을 완료하며, 반드시 그 후에 호출되어야 합니다.

beginCreate()도 참조하십시오 .

[virtual] QObject *QQmlComponent::create(QQmlContext *context = nullptr)

지정된 context 내에서 이 컴포넌트를 사용하여 객체 인스턴스를 생성합니다. 생성 실패 시 nullptr 를 반환합니다.

context 가 nullptr (기본값)인 경우, 엔진의 root context 에서 인스턴스를 생성합니다.

반환된 객체 인스턴스의 소유권은 호출자에게 이전됩니다.

이 컴포넌트에서 생성되는 객체가 비주얼 항목인 경우, 비주얼 부모가 있어야 하며, 이는 QQuickItem::setParentItem()를 호출하여 설정할 수 있습니다. 자세한 내용은 Qt Quick 의 ‘개념 - 비주얼 부모’를 참조하십시오.

QQmlEngine::ObjectOwnership도 참조하십시오 .

void QQmlComponent::create(QQmlIncubator &incubator, QQmlContext *context = nullptr, QQmlContext *forContext = nullptr)

제공된 ` incubator`을 사용하여 이 컴포넌트로부터 객체 인스턴스를 생성합니다. ` context `은 객체 인스턴스를 생성할 컨텍스트를 지정합니다.

context 가 nullptr (기본값)인 경우, 엔진의 root context 에서 인스턴스가 생성됩니다.

forContext 이 객체 생성이 의존하는 컨텍스트를 지정합니다. forContext 이 비동기적으로 생성되고 있으며, QQmlIncubator::IncubationMode 이 QQmlIncubator::AsynchronousIfNested 인 경우, 이 객체도 비동기적으로 생성됩니다. forContext 이 nullptr (기본값)인 경우, context 가 이 결정에 사용됩니다.

생성된 객체와 그 생성 상태는 incubator 를 통해 확인할 수 있습니다.

QQmlIncubator도 참조하십시오 .

QObject *QQmlComponent::createWithInitialProperties(const QVariantMap &initialProperties, QQmlContext *context = nullptr)

지정된 ` context` 내에서 이 컴포넌트의 객체 인스턴스를 생성하고, ` initialProperties`를 사용하여 최상위 속성을 초기화합니다.

initialProperties 중 설정할 수 없는 항목이 있으면 경고가 발생합니다. 필수 속성 중 설정되지 않은 것이 있으면 객체 생성이 실패하고 nullptr 를 반환하며, 이 경우 isError()는 true 를 반환합니다.

context 가 nullptr (기본값)인 경우, 엔진의 root context 에 인스턴스가 생성됩니다.

반환된 객체 인스턴스의 소유권은 호출자에게 이전됩니다.

QQmlComponent::create도 참조하십시오 .

QQmlContext *QQmlComponent::creationContext() const

해당 컴포넌트가 생성된 QQmlContext 를 반환합니다. 이는 QML에서 직접 생성된 컴포넌트에만 적용됩니다.

QQmlEngine *QQmlComponent::engine() const

이 컴포넌트의 ` QQmlEngine `를 반환합니다.

QList<QQmlError> QQmlComponent::errors() const

마지막 컴파일 또는 생성 작업 중에 발생한 오류 목록을 반환합니다. ` isError()`가 설정되어 있지 않으면 빈 목록이 반환됩니다.

[since 6.5] bool QQmlComponent::isBound() const

해당 컴포넌트가 ` pragma ComponentBehavior: Bound`를 지정하는 QML 파일에서 생성된 경우 true를 반환하고, 그렇지 않은 경우 false를 반환합니다.

이 함수는 Qt 6.5에서 도입되었습니다.

bool QQmlComponent::isError() const

status() == QQmlComponent::Error 인 경우 true를 반환합니다.

bool QQmlComponent::isLoading() const

status() == QQmlComponent::Loading 일 경우 true를 반환합니다.

bool QQmlComponent::isNull() const

status() == QQmlComponent::Null 일 때 true를 반환합니다.

bool QQmlComponent::isReady() const

status() == QQmlComponent::Ready 일 때 true를 반환합니다.

[slot, since 6.5] void QQmlComponent::loadFromModule(QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode = PreferSynchronous)

모듈 uri 에서 typeName 에 대한 QQmlComponent 를 불러옵니다. 타입이 QML 파일을 통해 구현된 경우, mode 를 사용하여 이를 불러옵니다. C++로 구현된 타입은 항상 동기식으로 불러옵니다.

QQmlEngine engine;
QQmlComponent component(&engine);
component.loadFromModule("QtQuick", "Item");
// once the component is ready
std::unique_ptr<QObject> item(component.create());
Q_ASSERT(item->metaObject() == &QQuickItem::staticMetaObject);

이 함수는 Qt 6.5에서 도입되었습니다.

loadUrl()도 참조하십시오 .

[slot] void QQmlComponent::loadUrl(const QUrl &url)

제공된 url 에서 QQmlComponent 를 불러오세요.

제공된 URL이 완전하고 정확한지 확인하십시오. 특히, 로컬 파일 시스템에서 파일을 불러올 때는 QUrl::fromLocalFile()을 사용하십시오.

상대 경로는 QQmlEngine::baseUrl()을 기준으로 해결되며, 별도로 지정되지 않는 한 이는 현재 작업 디렉터리입니다.

참고: 이 슬롯은 오버로드되어 있습니다. 이 슬롯에 연결하려면:

// Connect using qOverload:
connect(sender, &SenderClass::signal,
        qmlComponent, qOverload(&QQmlComponent::loadUrl));

// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
        qmlComponent, [receiver = qmlComponent](const QUrl &url) { receiver->loadUrl(url); });
더 많은 예제와 방법에 대해서는 오버로드된 슬롯에 연결하기를 참조하십시오.

[slot] void QQmlComponent::loadUrl(const QUrl &url, QQmlComponent::CompilationMode mode)

제공된 url 에서 QQmlComponent 를 불러오십시오. mode 가 Asynchronous 인 경우, 컴포넌트는 비동기적으로 불러와지고 컴파일됩니다.

제공된 URL이 완전하고 정확한지 확인하십시오. 특히, 로컬 파일 시스템에서 파일을 불러올 때는 QUrl::fromLocalFile()을 사용하십시오.

상대 경로는 QQmlEngine::baseUrl()을 기준으로 해결되며, 별도로 지정되지 않는 한 이는 현재 작업 디렉터리입니다.

참고: 이 슬롯은 오버로드되어 있습니다. 이 슬롯에 연결하려면:

// Connect using qOverload:
connect(sender, &SenderClass::signal,
        qmlComponent, qOverload(&QQmlComponent::loadUrl));

// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
        qmlComponent, [receiver = qmlComponent](const QUrl &url, QQmlComponent::CompilationMode mode) { receiver->loadUrl(url, mode); });
더 많은 예제와 접근 방법은 오버로드된 슬롯에 연결하기를 참조하십시오.

[signal] void QQmlComponent::progressChanged(qreal progress)

컴포넌트의 로딩 진행 상황이 변경될 때마다 발생합니다. ` progress `는 0.0(아직 로딩되지 않음)에서 1.0(완료됨) 사이의 현재 진행 상황을 나타냅니다.

참고: progress 속성에 대한알림 신호입니다.

[slot] void QQmlComponent::setData(const QByteArray &data, const QUrl &url)

QQmlComponent 가 지정된 QML data 을 사용하도록 설정합니다. url 가 제공된 경우, 이를 사용하여 컴포넌트 이름을 설정하고 이 컴포넌트가 해결하는 항목에 대한 기본 경로를 제공합니다. 컴포넌트는 동기식으로 로드 및 컴파일됩니다.

경고: 새로운컴포넌트는 동일한 URL을 가진 기존 컴포넌트를 덮어씁니다. 기존 컴포넌트의 URL을 전달해서는 안 됩니다.

void QQmlComponent::setInitialProperties(QObject *object, const QVariantMap &properties)

QQmlComponent 에서 생성된 object 의 최상위 properties 를 설정합니다.

이 메서드는 컴포넌트 인스턴스 생성에 대한 고급 제어 기능을 제공합니다. 일반적으로 프로그래머는 QQmlComponent::createWithInitialProperties 를 사용하여 컴포넌트에서 객체 인스턴스를 생성해야 합니다.

이 메서드는 ` beginCreate ` 호출 후, ` completeCreate ` 호출 전에 사용해야 합니다. 제공된 속성이 존재하지 않으면 경고가 발생합니다.

이 메서드는 초기 중첩 속성을 직접 설정하는 것을 허용하지 않습니다. 대신, 중첩 속성이 있는 값 유형 속성의 초기 값을 설정하려면 해당 값 유형을 생성하고, 중첩 속성을 할당한 다음, 생성될 객체의 초기 속성으로 해당 값 유형을 전달하면 됩니다.

예를 들어, `fond.bold`를 설정하려면 ` QFont`를 생성하고, 그 `weight`를 `bold`로 설정한 다음, 해당 폰트를 초기 속성으로 전달하면 됩니다.

[signal] void QQmlComponent::statusChanged(QQmlComponent::Status status)

컴포넌트의 상태가 변경될 때마다 발생합니다. ` status `는 새로운 상태가 됩니다.

참고: status 속성에 대한알림 신호입니다.

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