이 페이지에서

QQmlIncubator Class

QQmlIncubator 클래스를 사용하면 QML 객체를 비동기적으로 생성할 수 있습니다. 더 보기...

헤더: #include <QQmlIncubator>
CMake: find_package(Qt6 REQUIRED COMPONENTS Qml)
target_link_libraries(mytarget PRIVATE Qt6::Qml)
qmake: QT += qml

공개 유형

enum IncubationMode { Asynchronous, AsynchronousIfNested, Synchronous }
enum Status { Null, Ready, Loading, Error }

공개 함수

QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous)
void clear()
QList<QQmlError> errors() const
void forceCompletion()
QQmlIncubator::IncubationMode incubationMode() const
bool isError() const
bool isLoading() const
bool isNull() const
bool isReady() const
QObject *object() const
void setInitialProperties(const QVariantMap &initialProperties)
QQmlIncubator::Status status() const

보호된 함수

virtual void setInitialState(QObject *object)
virtual void statusChanged(QQmlIncubator::Status status)

상세 설명

뷰의 델리게이트나 애플리케이션의 새 페이지와 같은 QML 객체를 생성하는 데는, 특히 리소스가 제한된 모바일 기기에서 상당한 시간이 소요될 수 있습니다. 애플리케이션이 ` QQmlComponent::create()`를 직접 사용하면 QML 객체 인스턴스가 동기식으로 생성되는데, 객체의 복잡성에 따라 애플리케이션에서 눈에 띄는 멈춤이나 끊김 현상이 발생할 수 있습니다.

QQmlIncubator를 사용하면 애플리케이션의 유휴 시간을 활용하여 비동기적으로 생성하는 것을 포함하여, QML 객체 생성을 더 세밀하게 제어할 수 있습니다. 다음 예제는 QQmlIncubator의 간단한 사용법을 보여줍니다.

// Initialize the incubator
QQmlIncubator incubator;
component->create(incubator);

인큐베이터를 잠시 실행한 후(일반적으로 제어권을 이벤트 루프로 반환함으로써), 이를 폴링합니다. 나중에 인큐베이터로 다시 돌아가는 방법에는 여러 가지가 있습니다. QQuickWindow 가 보내는 신호 중 하나에 연결하거나, 이를 위해 특별히 QTimer 를 실행할 수도 있습니다. 또한 특정 목적을 위해 객체가 필요할 수 있으며, 해당 목적이 발생할 때 인큐베이터를 폴링할 수도 있습니다.

// Poll the incubator
if (incubator.isReady()) {
    QObject *object = incubator.object();
    // Use created object
}

비동기 인큐베이터는 QQmlEngine 에 설정된 QQmlIncubationController 에 의해 제어되며, 이를 통해 엔진은 애플리케이션이 유휴 상태이고 인큐베이션 중인 객체를 처리해야 할 시점을 알 수 있습니다. QQmlEngine 에 인큐베이션 컨트롤러가 설정되어 있지 않으면, QQmlIncubator 는 지정된 IncubationMode 에 관계없이 객체를 동기식으로 생성합니다. 기본적으로 인큐베이션 컨트롤러는 설정되어 있지 않습니다. 그러나 QQuickView, QQuickWindow 및 QQuickWidget 는 모두 각자의 QQmlEngine에 인큐베이션 컨트롤러를 설정합니다. 이러한 인큐베이션 컨트롤러는 뷰가 렌더링되는 동안 여러 프레임에 걸쳐 인큐베이션을 분산시킵니다.

QQmlIncubator는 세 가지 인큐베이션 모드를 지원합니다:

  • 동기식: 생성이 동기식으로 이루어집니다. 즉, ` QQmlComponent::create()` 호출이 반환되면 인큐베이터는 이미 `Error` 또는 `Ready` 상태 중 하나가 됩니다. 동기식 인큐베이터는 ` QQmlComponent `에서 직접 동기식 생성 메서드를 사용하는 것에 비해 실질적인 이점은 없지만, 동기식 및 비동기식 생성 모두에 동일한 API를 사용함으로써 애플리케이션 구현을 단순화할 수 있습니다.
  • 비동기(기본값) QQmlEngine 에 QQmlIncubatorController가 설정되어 있다고 가정할 때, 생성은 비동기적으로 수행됩니다.

    생성이 완료되거나 오류가 발생할 때까지 인큐베이터는 Loading 상태를 유지합니다. 상태 변경 알림을 받으려면 statusChanged() 콜백을 사용할 수 있습니다.

    애플리케이션은 즉시 필요하지 않은 객체를 생성할 때 비동기 인큐베이션 모드를 사용해야 합니다. 예를 들어, ` ListView ` 타입은 목록이 스크롤되는 동안 화면 밖으로 약간 벗어난 객체를 생성할 때 비동기 인큐베이션을 사용합니다. 비동기 생성 중에 객체가 즉시 필요한 경우, ` QQmlIncubator::forceCompletion()` 메서드를 호출하여 생성 과정을 동기식으로 완료할 수 있습니다.

  • AsynchronousIfNested 생성은 중첩된 비동기 생성 과정의 일부인 경우 비동기적으로, 그렇지 않은 경우 동기적으로 수행됩니다.

    QML 컴포넌트가 동기식 인스턴스화처럼 보이기를 원하는 대부분의 시나리오에서는 이 모드를 사용해야 합니다.

    이 모드는 예제를 통해 설명하는 것이 가장 좋습니다. ` ListView ` 유형이 처음 생성될 때, 표시할 초기 델리게이트 세트로 자체를 채워야 합니다. ListView 의 높이가 400 픽셀이고 각 델리게이트의 높이가 100 픽셀이라면, 4개의 초기 델리게이트 인스턴스를 생성해야 합니다. ListView 가 비동기 인큐베이션 모드를 사용한다면, ListView 는 항상 비어 있는 상태로 생성된 다음, 얼마 후 4개의 초기 항목이 나타납니다.

    반대로, ListView 가 동기식 인큐베이션 모드를 사용한다면 올바르게 동작하겠지만, 애플리케이션에 끊김 현상이 발생할 수 있습니다. QML이 일시 중지되어 ListView 의 델리게이트를 동기식으로 인스턴스화해야 하기 때문에, ListView 가 비동기식으로 인스턴스화되는 QML 컴포넌트의 일부라면 비동기 인스턴스화의 이점이 상당 부분 상쇄될 것입니다.

    AsynchronousIfNested 모드는 이 문제를 해결합니다. AsynchronousIfNested 를 사용하면, ListView 자체가 이미 비동기 인스턴스화의 일부인 경우 ListView 의 델리게이트가 비동기적으로 인스턴스화되고, 그렇지 않은 경우에는 동기적으로 인스턴스화됩니다. 중첩된 비동기 인스턴스화의 경우, 모든 중첩된 인스턴스화가 완료된 후에야 바깥쪽 비동기 인스턴스화가 완료됩니다. 이를 통해 바깥쪽 비동기 인스턴스화가 완료될 때쯤에는 ListView 와 같은 내부 항목들이 이미 초기 델리게이트 로딩을 완료한 상태가 됩니다.

    동기식(Synchronous) 인큐베이션 모드를 사용하는 것은 거의 항상 잘못된 방법입니다. 동기식 인스턴스화처럼 보이되, 애플리케이션에 멈춤이나 끊김 현상을 유발하는 단점은 피하고자 하는 요소나 컴포넌트는 비동기식( AsynchronousIfNested ) 인큐베이션 모드를 사용해야 합니다.

멤버 유형 문서

enum QQmlIncubator::IncubationMode

인큐베이터의 작동 모드를 지정합니다. 인큐베이션 모드와 관계없이, QQmlEngine 에 QQmlIncubationController 가 설정되어 있지 않은 경우 QQmlIncubator 는 동기식으로 동작합니다.

상수값설명
QQmlIncubator::Asynchronous0객체가 비동기적으로 생성됩니다.
QQmlIncubator::AsynchronousIfNested1객체가 이미 비동기 생성 과정의 일부인 컨텍스트에서 생성되는 경우, 이 인큐베이터는 기존 인큐베이션에 합류하여 비동기적으로 실행됩니다. 기존 인큐베이션은 해당 인큐베이션과 이 인큐베이션이 모두 완료될 때까지 Ready 상태가 되지 않습니다. 그렇지 않은 경우, 인큐베이션은 동기적으로 실행됩니다.
QQmlIncubator::Synchronous2객체는 동기식으로 생성됩니다.

enum QQmlIncubator::Status

QQmlIncubator 의 상태를 지정합니다.

상수값설명
QQmlIncubator::Null0인큐베이션이 진행 중이 아닙니다. 인큐베이션을 시작하려면 QQmlComponent::create()을 호출하십시오.
QQmlIncubator::Ready1객체가 완전히 생성되었으며, object()를 호출하여 액세스할 수 있습니다.
QQmlIncubator::Loading2객체가 생성 중입니다.
QQmlIncubator::Error3오류가 발생했습니다. errors()을 호출하여 오류 정보를 확인할 수 있습니다.

멤버 함수 문서

QQmlIncubator::QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous)

지정된 내용으로 새로운 인큐베이터를 생성합니다. mode

void QQmlIncubator::clear()

인큐베이터를 비웁니다. 진행 중인 모든 인큐베이션은 중단됩니다. 인큐베이터가 ‘Ready’ 상태인 경우, 생성된 객체는 삭제 되지 않습니다.

QList<QQmlError> QQmlIncubator::errors() const

객체를 인큐베이션하는 동안 발생한 오류 목록을 반환합니다.

void QQmlIncubator::forceCompletion()

진행 중인 모든 인큐베이션을 동기식으로 완료하도록 강제합니다. 이 호출이 반환되면 인큐베이터는 더 이상 ‘로딩’ 상태가 아닙니다.

QQmlIncubator::IncubationMode QQmlIncubator::incubationMode() const

QQmlIncubator 생성자에 전달된 인큐베이션 모드를 반환합니다.

bool QQmlIncubator::isError() const

인큐베이터의 ` status()` 메서드가 `Error`를 반환하면 `true`를 반환합니다.

bool QQmlIncubator::isLoading() const

인큐베이터의 ` status()` 상태가 ‘Loading’인 경우 true를 반환합니다.

bool QQmlIncubator::isNull() const

인큐베이터의 ` status()`가 `Null`인 경우 `true`를 반환합니다.

bool QQmlIncubator::isReady() const

인큐베이터의 ` status()` 상태가 ‘Ready’인 경우 true를 반환합니다.

QObject *QQmlIncubator::object() const

상태가 Ready인 경우 인큐베이션된 객체를 반환하고, 그렇지 않은 경우 0을 반환합니다.

void QQmlIncubator::setInitialProperties(const QVariantMap &initialProperties)

initialProperties 에 포함된 속성 이름과 초기값 간의 매핑을 저장하며, 이 매핑을 사용하여 인큐베이션 중인 컴포넌트가 초기화됩니다.

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

[virtual protected] void QQmlIncubator::setInitialState(QObject *object)

object 가 처음 생성된 후, 복잡한 속성 바인딩이 평가되기 전이며, 해당되는 경우 QQmlParserStatus::componentComplete()이 호출되기 전에 호출됩니다. 이는 QQmlComponent::beginCreate()과 QQmlComponent::completeCreate() 사이의 시점과 동일하며, 객체의 속성에 초기값을 할당하는 데 사용할 수 있습니다.

기본 구현은 아무 작업도 수행하지 않습니다.

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

QQmlIncubator::Status QQmlIncubator::status() const

인큐베이터의 현재 상태를 반환합니다.

[virtual protected] void QQmlIncubator::statusChanged(QQmlIncubator::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.