QQmlIncubator Class
QQmlIncubator 클래스를 사용하면 QML 객체를 비동기적으로 생성할 수 있습니다. 더 보기...
Header: | #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() 호출이 반환되면 인큐베이터는 이미 오류 또는 준비 상태에 있습니다. 동기식 인큐베이터는 QQmlComponent 에서 직접 동기식 생성 방법을 사용하는 것에 비해 실질적인 이점은 없지만 동기식 및 비동기식 생성에 모두 동일한 API를 사용하면 애플리케이션 구현이 간소화될 수 있습니다.
- 비동기(기본값) 생성은 비동기적으로 이루어지며, QQmlEngine 에 QQmlIncubatorController가 설정되어 있다고 가정합니다.
인큐베이터는 생성이 완료되거나 오류가 발생할 때까지 로드 중 상태로 유지됩니다. statusChanged () 콜백을 사용하여 상태 변경에 대한 알림을 받을 수 있습니다.
애플리케이션은 즉시 필요하지 않은 개체를 만들 때는 비동기 인큐베이션 모드를 사용해야 합니다. 예를 들어 ListView 유형은 비동기 인큐베이션을 사용하여 목록이 스크롤되는 동안 화면에서 약간 벗어난 개체를 만듭니다. 비동기 생성 중에 개체가 즉시 필요한 경우 QQmlIncubator::forceCompletion() 메서드를 호출하여 생성 프로세스를 동기적으로 완료할 수 있습니다.
- AsynchronousIfNested 생성은 중첩된 비동기 생성의 일부인 경우 비동기적으로, 그렇지 않은 경우 동기적으로 수행됩니다.
QML 컴포넌트가 동기 인스턴스화처럼 보이기를 원하는 대부분의 시나리오에서는 이 모드를 사용해야 합니다.
이 모드는 예시를 통해 가장 잘 설명됩니다. ListView 유형이 처음 생성되면 표시할 초기 델리게이트 집합으로 자체적으로 채워야 합니다. ListView 의 높이가 400픽셀이고 각 델리게이트의 높이가 100픽셀인 경우 초기 델리게이트 인스턴스 4개를 만들어야 합니다. ListView 에서 비동기 인큐베이션 모드를 사용하는 경우 ListView 은 항상 비어 있다가 나중에 4개의 초기 항목이 나타납니다.
반대로 ListView 이 동기식 인큐베이션 모드를 사용하면 올바르게 작동하지만 애플리케이션에 버벅거림이 발생할 수 있습니다. QML은 ListView 의 델리게이트를 동기적으로 중지하고 인스턴스화해야 하므로 ListView 이 비동기적으로 인스턴스화되는 QML 컴포넌트의 일부인 경우 비동기 인스턴스화의 이점을 대부분 상실하게 됩니다.
AsynchronousIfNested 모드는 이 문제를 해결합니다. AsynchronousIfNested 을 사용하면 ListView 자체가 이미 비동기 인스턴스화의 일부인 경우 ListView 델리게이트가 비동기적으로 인스턴스화되고 그렇지 않은 경우 동기적으로 인스턴스화됩니다. 중첩된 비동기 인스턴스화의 경우 외부 비동기 인스턴스화는 중첩된 모든 인스턴스화도 완료될 때까지 완료되지 않습니다. 이렇게 하면 외부 비동기 인스턴스화가 완료될 때 ListView 같은 내부 항목은 이미 초기 델리게이트 로드를 완료한 상태입니다.
동기 인스턴스화의 모양을 원하지만 애플리케이션이 멈추거나 끊기는 단점이 없는 요소나 컴포넌트는 AsynchronousIfNested 인큐베이션 모드를 사용해야 합니다.
멤버 유형 문서
enum QQmlIncubator::IncubationMode
인큐베이터가 작동하는 모드를 지정합니다. 인큐베이션 모드에 관계없이 QQmlEngine 에 QQmlIncubationController 설정이 없는 경우 QQmlIncubator 는 동기적으로 작동합니다.
상수 | 값 | 설명 |
---|---|---|
QQmlIncubator::Asynchronous | 0 | 개체가 비동기적으로 생성됩니다. |
QQmlIncubator::AsynchronousIfNested | 1 | 객체가 이미 비동기 생성의 일부인 컨텍스트에서 생성되는 경우 이 인큐베이터는 기존 인큐베이션에 합류하여 비동기적으로 실행됩니다. 기존 인큐베이션과 이 인큐베이션이 모두 완료될 때까지 기존 인큐베이션은 준비 상태가 되지 않습니다. 그렇지 않으면 인큐베이션이 동기적으로 실행됩니다. |
QQmlIncubator::Synchronous | 2 | 개체는 동기적으로 생성됩니다. |
enum QQmlIncubator::Status
QQmlIncubator 의 상태를 지정합니다.
Constant | 값 | 설명 |
---|---|---|
QQmlIncubator::Null | 0 | 인큐베이션이 진행 중이 아닙니다. 인큐베이팅을 시작하려면 QQmlComponent::create()를 호출하세요. |
QQmlIncubator::Ready | 1 | 개체가 완전히 생성되었으며 object()를 호출하여 액세스할 수 있습니다. |
QQmlIncubator::Loading | 2 | 개체가 생성되는 중입니다. |
QQmlIncubator::Error | 3 | 오류가 발생했습니다. errors ()를 호출하여 오류에 액세스할 수 있습니다. |
멤버 함수 문서
QQmlIncubator::QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous)
지정된 인큐베이터를 사용하여 새 인큐베이터를 만듭니다. mode
void QQmlIncubator::clear()
인큐베이터를 지웁니다. 진행 중인 모든 인큐베이션이 중단됩니다. 인큐베이터가 준비 상태인 경우 생성된 개체는 삭제되지 않습니다.
QList<QQmlError> QQmlIncubator::errors() const
오브젝트를 인큐베이팅하는 동안 발생한 오류 목록을 반환합니다.
void QQmlIncubator::forceCompletion()
진행 중인 모든 인큐베이션을 동기적으로 완료하도록 강제합니다. 이 호출이 반환되면 인큐베이터는 로딩 중 상태가 아닙니다.
QQmlIncubator::IncubationMode QQmlIncubator::incubationMode() const
QQmlIncubator 생성자에 전달된 인큐베이션 모드를 반환합니다.
bool QQmlIncubator::isError() const
인큐베이터의 status()가 오류인 경우 true를 반환합니다.
bool QQmlIncubator::isLoading() const
인큐베이터의 status()가 로드 중이면 true를 반환합니다.
bool QQmlIncubator::isNull() const
인큐베이터의 status()가 Null이면 true를 반환합니다.
bool QQmlIncubator::isReady() const
인큐베이터의 status()가 준비되면 true를 반환합니다.
QObject *QQmlIncubator::object() const
상태가 준비 상태이면 인큐베이트된 개체를 반환하고, 그렇지 않으면 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 새 상태입니다.
기본 구현은 아무 작업도 수행하지 않습니다.
© 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.