QQmlComponent Class
QQmlComponent クラスは、QML コンポーネントの定義をカプセル化しています。詳細...
| ヘッダー: | #include <QQmlComponent> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
| qmake: | QT += qml |
| QML内: | Component |
| 継承元: | QObject |
パブリック型
| enum | CompilationMode { PreferSynchronous, Asynchronous } |
| enum | Status { Null, Ready, Loading, Error } |
プロパティ
パブリック関数
| QQmlComponent(QQmlEngine *engine, QObject *parent = nullptr) | |
| QQmlComponent(QQmlEngine *engine, const QString &fileName, QObject *parent = nullptr) | |
| QQmlComponent(QQmlEngine *engine, const QUrl &url, QObject *parent = nullptr) | |
| QQmlComponent(QQmlEngine *engine, const QString &fileName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr) | |
| QQmlComponent(QQmlEngine *engine, const QUrl &url, QQmlComponent::CompilationMode mode, QObject *parent = nullptr) | |
(since 6.5) | QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QObject *parent = nullptr) |
(since 6.5) | QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr) |
| virtual | ~QQmlComponent() override |
| virtual QObject * | beginCreate(QQmlContext *context) |
| virtual void | completeCreate() |
| virtual QObject * | create(QQmlContext *context = nullptr) |
| void | create(QQmlIncubator &incubator, QQmlContext *context = nullptr, QQmlContext *forContext = nullptr) |
| QObject * | createWithInitialProperties(const QVariantMap &initialProperties, QQmlContext *context = nullptr) |
| QQmlContext * | creationContext() const |
| QQmlEngine * | engine() const |
| QList<QQmlError> | errors() const |
(since 6.5) bool | isBound() const |
| bool | isError() const |
| bool | isLoading() const |
| bool | isNull() const |
| bool | isReady() const |
| qreal | progress() const |
| void | setInitialProperties(QObject *object, const QVariantMap &properties) |
| QQmlComponent::Status | status() const |
| QUrl | url() const |
パブリックスロット
(since 6.5) void | loadFromModule(QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode = PreferSynchronous) |
| void | loadUrl(const QUrl &url) |
| void | loadUrl(const QUrl &url, QQmlComponent::CompilationMode mode) |
| void | setData(const QByteArray &data, const QUrl &url) |
シグナル
| void | progressChanged(qreal progress) |
| void | statusChanged(QQmlComponent::Status status) |
詳細な説明
コンポーネントは、明確に定義されたインターフェースを持つ、再利用可能でカプセル化されたQML型です。
QQmlComponentのインスタンスは、QMLファイルから作成できます。たとえば、次のようなmain.qml ファイルがある場合:
import QtQuick 2.0
Item {
width: 200
height: 200
}次のコードは、このQMLファイルをコンポーネントとして読み込み、create() を使用してこのコンポーネントのインスタンスを作成し、Item のwidth 値を取得します:
QQmlEngine*engine = newQQmlEngine;
QQmlComponent component(engine,QUrl::fromLocalFile("main.qml"));
if(component.isError()) {
qWarning() << "Failed to load main.qml:" << component.errors();
return 1;
}
QObject*myObject =component.create();
if(component.isError()) {
qWarning() << "Failed to create instance of main.qml:" << component.errors();
return 1;
}
QQuickItem*item =qobject_cast<QQuickItem*>(myObject);
intwidth= item->width(); // width = 200QQmlEngine インスタンスが利用できないコード内でコンポーネントのインスタンスを作成するには、qmlContext() またはqmlEngine() を使用できます。たとえば、以下のシナリオでは、QQuickItem のサブクラス内で子アイテムが作成されています:
void MyCppItem::init()
{
QQmlEngine *engine = qmlEngine(this);
// Or:
// QQmlEngine *engine = qmlContext(this)->engine();
QQmlComponent component(engine, QUrl::fromLocalFile("MyItem.qml"));
QQuickItem *childItem = qobject_cast<QQuickItem*>(component.create());
childItem->setParentItem(this);
}なお、これらの関数は、QObject のサブクラスのコンストラクタ内で呼び出された場合、そのインスタンスにはまだコンテキストもエンジンも設定されていないため、null を返すことに注意してください。
ネットワークコンポーネント
QQmlComponentに渡されたURLがネットワークリソースである場合、またはQMLドキュメントがネットワークリソースを参照している場合、QQmlComponentはオブジェクトを作成する前にネットワークデータを取得する必要があります。この場合、QQmlComponentのステータスはLoading status となります。アプリケーションは、コンポーネントがReady となるまで待機してから、QQmlComponent::create()を呼び出す必要があります。
次の例は、ネットワークリソースから QML ファイルをロードする方法を示しています。QQmlComponent を作成した後、そのコンポーネントがロード中かどうかをテストします。ロード中の場合は、QQmlComponent::statusChanged() シグナルに接続し、そうでない場合はcontinueLoading() メソッドを直接呼び出します。なお、ネットワークコンポーネントの場合、コンポーネントがキャッシュされており、すぐに利用可能な状態になっていると、QQmlComponent::isLoading() が false になる可能性があることに注意してください。
MyApplication::MyApplication()
{
// ...
component= newQQmlComponent(engine,QUrl("http://www.example.com/main.qml"));
if(component->isLoading()) {
QObject::connect(component, &QQmlComponent::statusChanged,
this, &MyApplication::continueLoading);
}else{
continueLoading();
}
}
voidMyApplication::continueLoading()
{
if(component->isError()) {
qWarning() << component->errors();
}else{
QObject*myObject = component->create();
}
}メンバ型のドキュメント
enum QQmlComponent::CompilationMode
QQmlComponent がコンポーネントを即座に読み込むか、非同期で読み込むかを指定します。
| 定数 | 値 | 説明 |
|---|---|---|
QQmlComponent::PreferSynchronous | 0 | コンポーネントを直ちに読み込み/コンパイルし、スレッドをブロックすることを優先します。ただし、これが常に可能とは限りません。たとえば、リモート URL は常に非同期で読み込まれます。 |
QQmlComponent::Asynchronous | 1 | バックグラウンドスレッドでコンポーネントを読み込み/コンパイルします。 |
enum QQmlComponent::Status
QQmlComponent の読み込み状態を指定します。
| 定数 | 値 | 説明 |
|---|---|---|
QQmlComponent::Null | 0 | このQQmlComponent にはデータがありません。QMLコンテンツを追加するには、loadUrl() またはsetData() を呼び出してください。 |
QQmlComponent::Ready | 1 | このQQmlComponent は準備が整っており、create() を呼び出すことができます。 |
QQmlComponent::Loading | 2 | このQQmlComponent はネットワークデータを読み込んでいます。 |
QQmlComponent::Error | 3 | エラーが発生しました。errors() を呼び出して、errors のリストを取得してください。 |
プロパティのドキュメント
[read-only] progress : qreal
コンポーネントの読み込みの進捗状況。0.0(読み込みなし)から1.0(完了)まで。
アクセス関数:
| qreal | progress() const |
通知シグナル:
| void | progressChanged(qreal progress) |
[read-only] status : Status
コンポーネントの現在のstatus 。
アクセス関数:
| QQmlComponent::Status | status() const |
通知シグナル:
| void | statusChanged(QQmlComponent::Status status) |
[read-only] url : const QUrl
コンポーネントのURL。これは、コンストラクタ、またはloadUrl()、あるいはsetData()メソッドのいずれかに渡されるURLです。
アクセス関数:
| QUrl | url() const |
メンバ関数のドキュメント
QQmlComponent::QQmlComponent(QQmlEngine *engine, QObject *parent = nullptr)
データを持たないQQmlComponentを作成し、指定されたengine およびparent を指定します。setData()を使用してデータを設定します。
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QString &fileName, QObject *parent = nullptr)
指定されたfileName からQQmlComponentを作成し、指定されたparent およびengine を割り当てます。
loadUrl()も参照してください 。
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QUrl &url, QObject *parent = nullptr)
指定されたurl からQQmlComponentを作成し、指定されたparent およびengine をそのコンポーネントに設定します。
指定された URL が完全かつ正しいことを確認してください。特に、ローカルファイルシステムからファイルをロードする場合は、QUrl::fromLocalFile() を使用してください。
相対パスはQQmlEngine::baseUrl() を基準に解決されます。これは、特に指定がない限り、現在の作業ディレクトリとなります。
loadUrl()も参照してください 。
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QString &fileName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
指定されたfileName からQQmlComponentを作成し、指定されたparent およびengine を設定します。mode がAsynchronous の場合、コンポーネントは非同期で読み込まれ、コンパイルされます。
loadUrl()も参照してください 。
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QUrl &url, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
指定されたurl からQQmlComponentを作成し、指定されたparent およびengine を設定します。mode がAsynchronous の場合、コンポーネントは非同期で読み込まれ、コンパイルされます。
指定するURLが完全かつ正確であることを確認してください。特に、ローカルファイルシステムからファイルをロードする際は、QUrl::fromLocalFile() を使用してください。
相対パスはQQmlEngine::baseUrl() に対して解決されます。これは、特に指定がない限り、現在の作業ディレクトリを指します。
loadUrl()も参照してください 。
[explicit, since 6.5] QQmlComponent::QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QObject *parent = nullptr)
指定されたuri およびtypeName からQQmlComponentを作成し、指定されたparent およびengine をそのコンポーネントに設定します。可能であれば、コンポーネントは同期的に読み込まれます。
これはオーバーロードされた関数です。
この関数は Qt 6.5 で導入されました。
loadFromModule()も参照してください 。
[explicit, since 6.5] QQmlComponent::QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
指定されたuri およびtypeName からQQmlComponentを作成し、指定されたparent およびengine をそのコンポーネントに設定します。mode がAsynchronous の場合、コンポーネントは非同期で読み込まれ、コンパイルされます。
これはオーバーロードされた関数です。
この関数は Qt 6.5 で導入されました。
loadFromModule()も参照してください 。
[override virtual noexcept] QQmlComponent::~QQmlComponent()
QQmlComponent を破壊せよ。
[virtual] QObject *QQmlComponent::beginCreate(QQmlContext *context)
指定されたcontext 内で、このコンポーネントからオブジェクトインスタンスを作成します。作成に失敗した場合は、nullptr を返します。
注:この メソッドは 、コンポーネントのインスタンス生成を詳細に制御するためのものです。一般的には、オブジェクトのインスタンスを作成する際にはQQmlComponent::create() を使用すべきです。
QQmlComponent がインスタンスを構築する際は、次の3つのステップで行われます。
- オブジェクト階層が作成され、定数値が代入されます。
- プロパティのバインディングが初めて評価されます。
- 該当する場合、オブジェクトに対してQQmlParserStatus::componentComplete()が呼び出されます。
QQmlComponent::beginCreate() は、ステップ 1 のみを実行するという点でQQmlComponent::create() とは異なります。ステップ 2 および 3 を完了するには、QQmlComponent::completeCreate() を呼び出す必要があります。
このブレークポイントは、アタッチされたプロパティを使用してインスタンス化されたコンポーネントに情報を伝達する場合に有用なことがあります。これは、プロパティのバインディングが有効になる前に、それらの初期値を設定できるためです。
返されるオブジェクトインスタンスの所有権は、呼び出し元に譲渡されます。
注: バインディングの「定数値」と「実際のバインディング」への分類は 意図的に未規定であり、Qt のバージョン間や、qmlcachegen を使用しているかどうか、またその使用方法によって変わる可能性があります。beginCreate() が戻る前または後に、特定のバインディングが評価されることを当てにしてはなりません。 たとえば、MyType.EnumValueのような定数式は、コンパイル時にそのように認識される場合もあれば、バインディングとして実行が延期される場合もあります。-(5)や"a" + "定数文字列" のような定数式についても同様です。
completeCreate() およびQQmlEngine::ObjectOwnershipも参照してください 。
[virtual] void QQmlComponent::completeCreate()
このメソッドを使用すると、コンポーネントのインスタンス作成を詳細に制御できます。通常、プログラマーはコンポーネントを作成する際に `QQmlComponent::create()` を使用する必要があります。
この関数は、QQmlComponent::beginCreate() で開始されたコンポーネントの作成を完了させるものであり、必ずその後に呼び出す必要があります。
beginCreate()も参照してください 。
[virtual] QObject *QQmlComponent::create(QQmlContext *context = nullptr)
指定されたcontext 内で、このコンポーネントからオブジェクトのインスタンスを作成します。作成に失敗した場合はnullptr を返します。
context がnullptr (デフォルト)の場合、エンジンのroot context 内にインスタンスが作成されます。
返されるオブジェクトインスタンスの所有権は、呼び出し元に譲渡されます。
このコンポーネントから作成されるオブジェクトがビジュアルアイテムである場合、そのオブジェクトにはビジュアル親が必要です。ビジュアル親は、QQuickItem::setParentItem() を呼び出すことで設定できます。詳細については、 Qt Quick の「概念 - ビジュアル親」を参照してください。
「QQmlEngine::ObjectOwnership」も参照してください 。
void QQmlComponent::create(QQmlIncubator &incubator, QQmlContext *context = nullptr, QQmlContext *forContext = nullptr)
提供された `incubator` を使用して、このコンポーネントからオブジェクトのインスタンスを作成します。`context ` は、オブジェクトのインスタンスを作成するコンテキストを指定します。
context がnullptr (デフォルト)の場合、エンジンのroot context 内にインスタンスが作成されます。
forContext このオブジェクトの作成が依存するコンテキストを指定します。forContext が非同期で作成されており、QQmlIncubator::IncubationMode がQQmlIncubator::AsynchronousIfNested の場合、このオブジェクトも非同期で作成されます。forContext がnullptr (デフォルト)の場合、この決定にはcontext が使用されます。
作成されたオブジェクトとその作成ステータスは、incubator を通じて取得できます。
「QQmlIncubator」も参照してください 。
QObject *QQmlComponent::createWithInitialProperties(const QVariantMap &initialProperties, QQmlContext *context = nullptr)
指定されたcontext 内で、このコンポーネントのオブジェクトインスタンスを作成し、initialProperties を使用してそのトップレベルのプロパティを初期化します。
initialProperties のいずれかが設定できない場合、警告が出力されます。必須のプロパティが未設定の場合、オブジェクトの作成は失敗し、nullptr が返されます。この場合、isError()はtrue を返します。
context がnullptr (デフォルト)の場合、エンジンのroot context にインスタンスが作成されます。
返されるオブジェクトインスタンスの所有権は、呼び出し元に譲渡されます。
「QQmlComponent::create」も参照してください 。
QQmlContext *QQmlComponent::creationContext() const
そのコンポーネントが作成されたQQmlContext を返します。これは、QMLから直接作成されたコンポーネントにのみ適用されます。
QQmlEngine *QQmlComponent::engine() const
このコンポーネントのQQmlEngine を返します。
QList<QQmlError> QQmlComponent::errors() const
前回のコンパイルまたは作成操作中に発生したエラーのリストを返します。isError()が設定されていない場合は、空のリストが返されます。
[since 6.5] bool QQmlComponent::isBound() const
コンポーネントがpragma ComponentBehavior: Bound を指定したQMLファイル内で作成された場合はtrueを返し、それ以外の場合はfalseを返します。
この関数は Qt 6.5 で導入されました。
bool QQmlComponent::isError() const
status() ==QQmlComponent::Error の場合、true を返します。
bool QQmlComponent::isLoading() const
status() ==QQmlComponent::Loading の場合、true を返します。
bool QQmlComponent::isNull() const
status() ==QQmlComponent::Null の場合、true を返します。
bool QQmlComponent::isReady() const
status() ==QQmlComponent::Ready の場合、true を返します。
[slot, since 6.5] void QQmlComponent::loadFromModule(QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode = PreferSynchronous)
モジュール `uri` 内の `typeName ` に対応する `QQmlComponent ` を読み込みます。型が QML ファイルを介して実装されている場合、`mode ` を使用して読み込まれます。C++ を基盤とする型は、常に同期的に読み込まれます。
QQmlEngine engine;
QQmlComponent component(&engine);
component.loadFromModule("QtQuick", "Item");
// once the component is ready
std::unique_ptr<QObject> item(component.create());
Q_ASSERT(item->metaObject() == &QQuickItem::staticMetaObject);この関数は Qt 6.5 で導入されました。
loadUrl()も参照してください 。
[slot] void QQmlComponent::loadUrl(const QUrl &url)
提供されたurl からQQmlComponent を読み込んでください。
指定する URL が完全かつ正しいことを確認してください。特に、ローカルファイルシステムからファイルをロードする際は、QUrl::fromLocalFile() を使用してください。
相対パスは `QQmlEngine::baseUrl()` に対して解決されます。これは、特に指定がない限り、現在の作業ディレクトリを指します。
注: この スロットは オーバーロードされています。このスロットに接続するには:
// Connect using qOverload:
connect(sender, &SenderClass::signal,
qmlComponent, qOverload(&QQmlComponent::loadUrl));
// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
qmlComponent, [receiver = qmlComponent](const QUrl &url) { receiver->loadUrl(url); }); [slot] void QQmlComponent::loadUrl(const QUrl &url, QQmlComponent::CompilationMode mode)
提供されたurl からQQmlComponent を読み込みます。mode がAsynchronous の場合、コンポーネントは非同期で読み込まれ、コンパイルされます。
指定された URL が完全かつ正しいことを確認してください。特に、ローカルファイルシステムからファイルをロードする場合は、QUrl::fromLocalFile() を使用してください。
相対パスはQQmlEngine::baseUrl() に対して解決されます。これは、特に指定がない限り、現在の作業ディレクトリを指します。
注:この スロットは オーバーロードされています。このスロットに接続するには:
// Connect using qOverload:
connect(sender, &SenderClass::signal,
qmlComponent, qOverload(&QQmlComponent::loadUrl));
// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
qmlComponent, [receiver = qmlComponent](const QUrl &url, QQmlComponent::CompilationMode mode) { receiver->loadUrl(url, mode); }); [signal] void QQmlComponent::progressChanged(qreal progress)
コンポーネントの読み込み進捗が変化するたびに発火します。progress には、0.0(未読み込み)から 1.0(完了)までの範囲で、現在の進捗値が設定されます。
注: プロパティ `progress` に対する通知 シグナルです。
[slot] void QQmlComponent::setData(const QByteArray &data, const QUrl &url)
QQmlComponent を、指定された QML ファイル(data )を使用するように設定します。url が指定された場合、その値はコンポーネント名の設定および、このコンポーネントによって解決される項目のベースパスの指定に使用されます。コンポーネントは同期的に読み込まれ、コンパイルされます。
警告: 新しいコンポーネントは 、同じURLを持つ既存のコンポーネントをすべて上書きします。既存のコンポーネントのURLを渡さないでください。
void QQmlComponent::setInitialProperties(QObject *object, const QVariantMap &properties)
QQmlComponent から作成されたobject のトップレベルのproperties を設定します。
このメソッドは、コンポーネントインスタンスの作成を詳細に制御します。一般的に、プログラマーはQQmlComponent::createWithInitialProperties を使用して、コンポーネントからオブジェクトインスタンスを作成する必要があります。
このメソッドは、beginCreate の後に、completeCreate が呼び出される前に使用してください。指定されたプロパティが存在しない場合、警告が出力されます。
このメソッドでは、ネストされた初期プロパティを直接設定することはできません。代わりに、ネストされたプロパティを持つ値型プロパティの初期値を設定するには、その値型を作成し、そのネストされたプロパティに値を割り当て、その値型を構築するオブジェクトの初期プロパティとして渡すことで実現できます。
たとえば、`fond.bold` を設定するには、`QFont` を作成し、その太さを `bold` に設定してから、そのフォントを初期プロパティとして渡します。
[signal] void QQmlComponent::statusChanged(QQmlComponent::Status 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.