Qt从C ++控制OSM位置

时间:2018-01-11 13:13:19

标签: c++ qt qml openstreetmap

在我的Qt5.9小部件应用程序项目(Windows)中,我在ui中添加了一个QQuickWidget,并将源文件设置为QML文件。

我的目的是在QQuickWidget中显示打开的街道地图。通过单击按钮,地图的中心位置应更改为特定的纬度/经度坐标。

地图会按预期显示在QQuickWidget中,但是,我无法通过点击按钮来改变位置。

我正在使用此QML文件内容来显示地图:

//================================
// map.qml
//================================
import QtQuick 2.0
import QtQuick.Window 2.0
import QtLocation 5.6
import QtPositioning 5.6

Item {
    id: qmlMap

    Plugin {
        id: osmPlugin
        name: "osm"
    }

    Map {
        id: map
        anchors.fill: parent
        plugin: osmPlugin
        center: QtPositioning.coordinate(59.91, 10.75)
        zoomLevel: 10
        objectName: "mainMap"

    MapQuickItem {
      id: marker
      coordinate {latitude: 59.91
                 longitude: 10.75}
      anchorPoint.x: image.width * 0.5
      anchorPoint.y: image.height

      sourceItem: Image {
         id: image
         height: 35
         width: 35
         source: "geotag.png"
      }
            function recenter(lat,lng) {
                  map.clearMapItems();
                  marker.coordinate.latitude = lat;
                  marker.coordinate.longitude = lng;
                  map.addMapItem(marker);
                  map.center.latitude = lat;
                  map.center.longitude = lng;
                  map.update();
            }
    }
    }
}

在应用程序启动时,我可以看到OSM以我指定的位置为中心,我也可以在正确的位置看到标记。

Loaded map on start up

然而,当我点击我的按钮从C ++调用函数recenter(lat,lng)时,似乎没有任何事情发生(地图上没有位置变化可见)。

用于位置更改的我的C ++按钮代码是:

void mapproject::on_btnUpdatePos_clicked()
{
    QQmlEngine engine;
    QQmlComponent component(&engine, "qrc:/map.qml");
    QObject *object = component.create();

    QVariant returnedValue;
    QVariant pos = QVariant(0);

    if(object != NULL){
       QMetaObject::invokeMethod(object, "recenter",
       Q_RETURN_ARG(QVariant, returnedValue),
       Q_ARG(QVariant, pos),
       Q_ARG(QVariant, pos));
    }
}

为什么位置变化不起作用?我的QML文件或C ++代码中是否有错误?

1 个答案:

答案 0 :(得分:0)

假设已通过Qt Designer添加了.content(),并且它被称为QQuickWidget,因此您可以使用quickWidget访问它。

要进行简单搜索,您可以在MapQuickItem中设置objectName:

ui->quickWidget

您不应该创建新组件,应该使用MapQuickItem { id: marker objectName: "mapItem" coordinate {latitude: 59.91 [...] ,首先要通过QQuickWidget方法获取显示QQuickWidget的项目,然后查找名为rootObject()的子项并调用recenter方法:

mapItem

完整示例可在以下link

中找到