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 に関係なく同期的にオブジェクトを作成します。デフォルトでは、インキュベーション・コントローラは設定されていない。しかし、QQuickViewQQuickWindowQQuickWidget はすべて、それぞれのQQmlEngineにインキュベーションコントローラを設定します。これらのインキュベーションコントローラは、ビューのレンダリング中に、複数のフレームにまたがってインキュベーションの間隔を空けます。

QQmlIncubatorは3つのインキュベーションモードをサポートしています:

  • 同期(Synchronous) 作成は同期的に行われます。つまり、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 のような内側のアイテムはすでに初期デリゲートのロードを完了していることが保証されます。

    同期インスタンス化のように見せたいが、アプリケーションにフリーズやスタッタを発生させるデメリットがない要素やコンポーネントは、AsynchronousIfNested インキュベーションモードを使用する必要があります。

メンバ型のドキュメント

enum QQmlIncubator::IncubationMode

インキュベーターが動作するモードを指定する。インキュベーションモードに関わらず、QQmlEngineQQmlIncubationController が設定されていない場合、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 なら真を返す。

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 が新しいステータス。

デフォルトの実装では何もしない。

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