Schnittstellen zwischen C++- und QML-Code in Qt Positioning

Übersicht

Qt Positioning verwendet zwei Methoden, um den Austausch von Positionsdaten zwischen C++- und QML-Code zu vereinfachen.

Direkte Integration von C++-Werten in QtPositioning

Seit Qt 5.5 ist es viel einfacher geworden, nicht aufQObject basierende Datentypen in QML zu integrieren. Dies wird durch das Hinzufügen von Q_GADGET Unterstützung zu QtQml erreicht. Das Makro konvertiert Klassen in eine leichtgewichtige Version von QObject ohne die erforderliche QObject Vererbung. Gleichzeitig werden die Reflexionsfähigkeiten von QMetaObject beibehalten, so dass sie direkt in QML eingesetzt werden können.

Eine beträchtliche Anzahl von positionsbezogenen Datentypen wurde in Q_GADGETumgewandelt. Sie behalten ihren API- und Wertetyp-Charakter, sind aber über QMetaObject introspektierbar geworden.

Das Makro QML_ANONYMOUS wird verwendet, um diese Typen der QML-Umgebung zugänglich zu machen. In der Dokumentation QQmlEngine finden Sie weitere Einzelheiten und eine vollständige Liste der verfügbaren Makros.

Die Klassen werden jedoch nicht direkt mit diesem Makro erweitert, da wir nicht wollen, dass Qt Positioning von QtQml abhängt. Daher wird für jede von ihnen eine Hilfsklasse erstellt und das Makro QML_FOREIGN verwendet:

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

Die obige Registrierung der Positionierungstypen wird einmalig automatisch durch das QtPositioning QML-Plugin durchgeführt.

QVariant-basierte Integration

Dieser Abschnitt enthält Informationen über die Integration von QGeoAddress und QGeoLocation.

Adresse - QGeoAddress

Die Eigenschaft Address.address wird verwendet, um eine Schnittstelle zwischen C++- und QML-Code zu schaffen. Zuerst muss ein Zeiger auf ein Address Objekt von C++ erhalten werden, dann müssen die Funktionen property() und setProperty() verwendet werden, um die Eigenschaft address zu erhalten und zu setzen.

Das folgende Codestück holt das QGeoAddress Objekt aus C++:

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

Der folgende Code setzt die Adresseigenschaft des QML-Objekts auf der Grundlage eines QGeoAddress -Objekts aus C++:

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

Standort - QGeoLocation

Die Eigenschaft Location.location wird verwendet, um eine Schnittstelle zwischen C++- und QML-Code zu schaffen. Zuerst muss ein Zeiger auf ein Location Objekt von C++ erhalten werden, dann müssen die Funktionen property() und setProperty() verwendet werden, um die Eigenschaft location zu erhalten und zu setzen.

Das folgende Codestück holt das QGeoLocation Objekt aus C++:

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

Der folgende Code setzt die Eigenschaft location des QML-Objekts auf der Grundlage eines QGeoLocation -Objekts aus C++:

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.