Qt uses qml (QtLocation) to display the map

1. Confirmation of qt version and QtLocation module version

If the qt version is too low, there is no QtLocation module. My version is as follows.
Insert image description here
The build tool version is as follows.
Insert image description here

2. Writing qml code

1. Add modules to the project

First add the module to the projectquickwidgets positioning location
Insert image description here

2. Add resource files

Insert image description here

3. Add the qml file to the resource file

Insert image description here

4. Writing qml code

import QtQuick
import QtLocation
import QtPositioning
import QtQuick.Controls
Rectangle {
    
    
    width: parent
    height: parent
    visible: true
    Control{
    
    
        id:labelcpp
        objectName: 'labelcpp'
        font.pointSize: 38
        property real latitudeSave: 22.64018
        property real longitudeSave: 113.92746
        //cpp调用这个函数
        function getText()
        {
    
    
            return  map.center + " zoom " + map.zoomLevel.toFixed(3)
                    + " min " + map.minimumZoomLevel + " max " + map.maximumZoomLevel
        }
        function setCoordinate(latitude,longitude)
        {
    
    
            latitudeSave = latitude
            longitudeSave = longitude
            map.center.latitude = latitude
            map.center.longitude = longitude
            map.update()
            console.log("latitude="+latitude+"   longitude="+longitude);
        }
    }


    Plugin {
    
    
        id: mapPlugin
        name: "osm"
//        PluginParameter { name: "osm.mapping.providersrepository.address"; value: "http://www.mywebsite.com/osm_repository" }
//        PluginParameter { name: "osm.mapping.highdpi_tiles"; value: true }
    }

    Map {
    
    
        id: map
        anchors.fill: parent
        plugin: mapPlugin
        center: QtPositioning.coordinate(22.64018, 113.92746) // Oslo
        zoomLevel: 14
        property geoCoordinate startCentroid

        PinchHandler {
    
    
            id: pinch
            target: null
            onActiveChanged: if (active) {
    
    
                map.startCentroid = map.toCoordinate(pinch.centroid.position, false)
            }
            onScaleChanged: (delta) => {
    
    
                map.zoomLevel += Math.log2(delta)
                map.alignCoordinateToPoint(map.startCentroid, pinch.centroid.position)
            }
            onRotationChanged: (delta) => {
    
    
                map.bearing -= delta
                map.alignCoordinateToPoint(map.startCentroid, pinch.centroid.position)
            }
            grabPermissions: PointerHandler.TakeOverForbidden
        }
        WheelHandler {
    
    
            id: wheel
            // workaround for QTBUG-87646 / QTBUG-112394 / QTBUG-112432:
            // Magic Mouse pretends to be a trackpad but doesn't work with PinchHandler
            // and we don't yet distinguish mice and trackpads on Wayland either
            acceptedDevices: Qt.platform.pluginName === "cocoa" || Qt.platform.pluginName === "wayland"
                             ? PointerDevice.Mouse | PointerDevice.TouchPad
                             : PointerDevice.Mouse
            rotationScale: 1/120
            property: "zoomLevel"
        }
        DragHandler {
    
    
            id: drag
            target: null
            onTranslationChanged: (delta) => map.pan(-delta.x, -delta.y)

        }
        Shortcut {
    
    
            enabled: map.zoomLevel < map.maximumZoomLevel
            sequence: StandardKey.ZoomIn
            onActivated: map.zoomLevel = Math.round(map.zoomLevel + 1)
        }
        Shortcut {
    
    
            enabled: map.zoomLevel > map.minimumZoomLevel
            sequence: StandardKey.ZoomOut
            onActivated: map.zoomLevel = Math.round(map.zoomLevel - 1)
        }
        Component.onCompleted: {
    
    
            map.addMapItem(circle)
        }
    }
    MapCircle {
    
    
        id: circle
        center: QtPositioning.coordinate(labelcpp.latitudeSave,labelcpp.longitudeSave)
        radius: 50
        border.width: 5

        //鼠标按住后可移动
        MouseArea {
    
    
            anchors.fill: parent
            drag.target: parent
        }
    }
}


ControlIt is used for data interaction with C++. By setCoordinatesending coordinates and fixing a point on the map, getTextit is used to obtain the midpoint of the map and the map zoom level.

5. Interact with c++ to send coordinate points

void MainWindow::on_pushButton_clicked()
{
    
    
    QQuickItem *root = ui->quickWidget->rootObject();//拿到所有对象的列表
    auto labelqml = root->findChild<QObject*>("labelcpp");//名字要与main.qml中的 objectName: 'labelcpp' 相同
    QVariant ret;
    QMetaObject::invokeMethod(labelqml, "setCoordinate", Q_ARG(QVariant, 22.65599), Q_ARG(QVariant, 113.92576));
    qDebug() << ret.toString();
}

3. Effect display

Insert image description here

Guess you like

Origin blog.csdn.net/qq_15181569/article/details/132364456