C++とQMLコードのインターフェースQt Positioning

概要

Qt Positioning は、C++とQMLコード間の位置データ交換を簡略化する2つの方法を利用します。

QtPositioning における C++ 値の直接統合

Qt 5.5 から、QObject 以外のデータ型を QML に統合することが容易になりました。これは、QtQmlQ_GADGET サポートを追加することで実現されています。このマクロは、必要なQObject 継承を行わずに、クラスをQObject の軽量版に変換します。同時に、QMetaObject のリフレクション機能を保持します。 その結果、これらのデータ型をQMLに直接公開することができます。

Q_GADGETこれらのデータ型は、APIと値型の特徴を保持したまま、QMetaObject を介してイントロスペクタブルになりました。

これらのデータ型を QML 環境に公開するにはQML_ANONYMOUS マクロを使用します。詳細と利用可能なマクロの一覧はQQmlEngine のドキュメントを参照してください。

しかし、Qt PositioningQtQml に依存させたくないので、クラスはこのマクロで直接拡張されません。そのため、それぞれにヘルパークラスが作成され、QML_FOREIGN マクロが使用されます:

struct QGeoCoordinateForeign
{
    Q_GADGET
    QML_FOREIGN(QGeoCoordinate)
    QML_ANONYMOUS
    QML_ADDED_IN_VERSION(5, 0)
};

上記のポジショニングタイプの登録は、QtPositioning QMLプラグインによって自動的に一度だけ行われます。

QVariantベースの統合

このセクションでは、QGeoAddressQGeoLocation の統合方法について説明します。

住所 - QGeoAddress

Address.address プロパティは、C++ と QML コード間のインターフェイスを提供するために使用され ます。まず、Address オブジェクトへのポインタを C++ から取得し、次にproperty() とsetProperty() 関数を用いてaddress プロパティを取得・設定する必要があります。

次のコードは C++ からQGeoAddress オブジェクトを取得するものです:

 QGeoAddress geoAddress = qmlObject->property("address").value<QGeoAddress>();

次のコードは、C++からQGeoAddress オブジェクトを取得し、QML オブジェクトの Address プロパティを設定します:

qmlObject->setProperty("address", QVariant::fromValue(geoAddress));

場所 - QGeoLocation

Location.location プロパティは、C++ と QML のコード間のインターフェイスとして使用されます。まず、Location オブジェクトへのポインタを C++ から取得し、次にproperty() およびsetProperty() 関数を使ってlocation プロパティを取得・設定する必要があります。

次のコードは C++ からQGeoLocation オブジェクトを取得するものです:

QGeoLocation geoLocation = qmlObject->property("location").value<QGeoLocation>();

次のコードは、C++ からQGeoLocation オブジェクトを取得し、QML オブジェクトの location プロパティを設定します:

qmlObject->setProperty("location", QVariant::fromValue(geoLocation));

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