QQmlComponent Class
QQmlComponent クラスは QML コンポーネントの定義をカプセル化します。詳細...
Header: | #include <QQmlComponent> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
qmake: | QT += qml |
In QML: | Component |
Inherits: | 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 = new QQmlEngine; QQmlComponent component(engine, QUrl::fromLocalFile("main.qml")); QObject *myObject = component.create(); QQuickItem *item = qobject_cast<QQuickItem*>(myObject); int width = item->width(); // width = 200
QQmlEngine のインスタンスがないコードでコンポーネントのインスタンスを作成するには、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() が偽になる場合があることに注意してください。
MyApplication::MyApplication() { // ... component = new QQmlComponent(engine, QUrl("http://www.example.com/main.qml")); if (component->isLoading()) { QObject::connect(component, &QQmlComponent::statusChanged, this, &MyApplication::continueLoading); } else { continueLoading(); } } void MyApplication::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 : const qreal
0.0 (何もロードされていない) から 1.0 (完了) までの、コンポーネントのロードの進行状況。
アクセス関数:
qreal | progress() const |
Notifier シグナル:
void | progressChanged(qreal progress) |
[read-only]
status : const 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 を与えます。
特に、ローカルファイルシステムからファイルを読み込む場合は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 の場合、コンポーネントは非同期にロードおよびコンパイルされます。
特に、ローカルファイルシステムからファイルをロードする場合は、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()は、QQmlComponent::create()と異なり、ステップ1のみを実行します。ステップ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
を返します。
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 の場合に真を返します。
bool QQmlComponent::isLoading() const
status() ==QQmlComponent::Loading の場合に真を返します。
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 をロードします。
特に、ローカルファイルシステムからファイルをロードする場合は、QUrl::fromLocalFile() を使用してください。
相対パスはQQmlEngine::baseUrl() に対して解決される。 () は、指定しない限り現在の作業ディレクトリである。
[slot]
void QQmlComponent::loadUrl(const QUrl &url, QQmlComponent::CompilationMode mode)
提供されたurl からQQmlComponent をロードする。mode がAsynchronous の場合、コンポーネントは非同期にロードおよびコンパイルされる。
特に、ローカル・ファイルシステムからファイルをロードする場合は、QUrl::fromLocalFile() を使用する。
相対パスは、QQmlEngine::baseUrl() に対して解決される。 () は、指定されない限り、現在の作業ディレクトリである。
[signal]
void QQmlComponent::progressChanged(qreal progress)
progress は、0.0(何もロードされていない)から 1.0(完了)までの現在の進行状況になります。
注意: progress プロパティに対するノーティファイアシグナル。
[slot]
void QQmlComponent::setData(const QByteArray &data, const QUrl &url)
与えられたQMLdata を使うようにQQmlComponent を設定します。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 プロパティに対するノーティファイアシグナルです。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。