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 に関係なく同期的にオブジェクトを作成します。デフォルトでは、インキュベーション・コントローラは設定されていない。しかし、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コンポーネントの一部であった場合、非同期インスタンス化の利点の多くが失われることになります。

    AsynchronousIfNestedAsynchronousIfNested を使用することで、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()

進行中のインキュベーションを同期的に強制終了します。このコールが戻ると、インキュベータはLoading状態ではなくなる。

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

デフォルトの実装では何もしません。

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。