このページでは

コンテキストプロパティを使用したC++オブジェクトのQMLへの埋め込み

警告: QML コードでコンテキストプロパティを使用すると 、そのコードを記述した際に想定していた特定のコンテキストへの依存関係が生じます。コードが再利用される他の場所ではコンテキストが異なる可能性があるため、これによりコードの再利用性が制限されます。さらに、この依存関係は明示的に宣言されていません。 コンテキストをimport で明示したり、期待するコンテキストを何らかの形で記述したりすることは決してありません。そのため、コードを再利用しようとする人は、その再利用先がコードにとって十分なコンテキストを備えているかどうかを判断するのに困難を伴うことになります。

警告:コンテキスト プロパティは、QMLコードをQMLエンジンに読み込む前に事前処理を行うツールからは認識されません。Qt Quick コンパイラ、qmllint、および QML Language Server は、コンテキストプロパティに関する情報を一切認識せず、コンテキストプロパティへのアクセスをすべて修飾されていないアクセスとして扱います。

注:コンテキスト プロパティは 、一般的に、コンポーネントのルートオブジェクト上の通常のプロパティ、あるいは C++ でQML_SINGLETONを使用して定義されたシングルトン、または QML でpragma Singleton を使用して定義されたシングルトンのいずれかで置き換えることができます。

QML オブジェクトを C++ アプリケーションに読み込む際、QML コード内から使用できる C++ データを直接埋め込むと便利な場合があります。これにより、たとえば、埋め込まれたオブジェクトの C++ メソッドを呼び出したり、C++ オブジェクトのインスタンスを QML ビューのデータモデルとして使用したりすることが可能になります。

QMLオブジェクトにC++データを注入する機能は、QQmlContext クラスによって実現されます。このクラスは、QMLオブジェクトのコンテキストに対してデータを公開し、QMLコードのスコープ内からそのデータに直接参照できるようにします。

単純なコンテキストプロパティの設定

たとえば、以下は、現在のスコープ内に存在しない `currentDateTime ` の値を参照する QML アイテムです。

// MyItem.qml
import QtQuick

Text { text: currentDateTime }

このcurrentDateTime の値は、QMLコンポーネントを読み込むC++アプリケーションから、QQmlContext::setContextProperty() を使用して直接設定できます:

QQuickView view;
view.rootContext()->setContextProperty("currentDateTime", QDateTime::currentDateTime());
view.setSource(QUrl::fromLocalFile("MyItem.qml"));
view.show();

注: QMLで評価されるすべての式は特定のコンテキスト内で評価されるため 、コンテキストが変更されると、そのコンテキスト内のすべてのバインディングが再評価されます。したがって、アプリケーションの初期化以外でコンテキストプロパティを使用する際は、アプリケーションのパフォーマンス低下につながる可能性があるため、注意が必要です。

オブジェクトをコンテキストプロパティとして設定する

コンテキストプロパティには、QVariant またはQObject*の値を格納できます。つまり、このアプローチを使用してカスタムC++オブジェクトを注入することも可能であり、これらのオブジェクトはQML内で直接変更および読み取りが可能です。ここでは、上記の例を修正して、QDateTime 値の代わりにQObject インスタンスを埋め込み、QMLコードからそのオブジェクトインスタンスのメソッドを呼び出します:

C++
class ApplicationData : public QObject
{
    Q_OBJECT
public:
    Q_INVOKABLE QDateTime getCurrentDateTime() const {
        return QDateTime::currentDateTime();
    }
};

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);

    QQuickView view;

    ApplicationData data;
    view.rootContext()->setContextProperty("applicationData", &data);

    view.setSource(QUrl::fromLocalFile("MyItem.qml"));
    view.show();

    return app.exec();
}
QML
// MyItem.qml
import QtQuick

Text { text: applicationData.getCurrentDateTime() }

(C++ から QML へ返される日付/時刻の値は、Qt.formatDateTime() および関連関数を使用してフォーマットできることに注意してください。)

QMLアイテムがコンテキストプロパティからのシグナルを受信する必要がある場合は、Connections 型を使用してそれらに接続できます。たとえば、ApplicationData にdataChanged() という名前のシグナルがある場合、このシグナルには、Connections オブジェクト内のonDataChanged ハンドラを使用して接続できます:

Text {
    text: applicationData.getCurrentDateTime()

    Connections {
        target: applicationData
        onDataChanged: console.log("The application data changed!")
    }
}

詳細については、QQmlContext のドキュメントも参照してください。

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