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は3つのインキュベーションモードをサポートしています:
- 同期モード:作成は同期的に行われます。つまり、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::Asynchronous | 0 | オブジェクトは非同期的に作成されます。 |
QQmlIncubator::AsynchronousIfNested | 1 | オブジェクトが、すでに非同期作成の一部となっているコンテキスト内で作成される場合、このインキュベーターは既存のインキュベーションに参加し、非同期で実行されます。既存のインキュベーションは、それ自体とこのインキュベーションの両方が完了するまで「Ready」状態にはなりません。それ以外の場合は、インキュベーションは同期的に実行されます。 |
QQmlIncubator::Synchronous | 2 | オブジェクトは同期的に作成されます。 |
enum QQmlIncubator::Status
QQmlIncubator のステータスを指定します。
| 定数 | 値 | 説明 |
|---|---|---|
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()
インキュベーターをクリアします。進行中のインキュベーションはすべて中止されます。インキュベーターが「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」の場合、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" + " constant string" などの定数式についても同様です。
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.