簡體   English   中英

Qt從C ++控制OSM位置

[英]Qt control OSM location from C++

在我的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位於指定位置的中心,並且還可以在正確的位置看到標記。

啟動時加載的地圖

但是,當我單擊按鈕以從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 ++代碼中有錯誤嗎?

假設QQuickWidget是通過Qt Designer添加的,並且稱為quickWidget ,那么您可以使用ui->quickWidget對其進行訪問。

要進行簡單搜索,可以在MapQuickItem中設置一個objectName:

MapQuickItem {
    id: marker
    objectName: "mapItem"
    coordinate {latitude: 59.91
    [...]

您不應該創建新組件,而應使用QQuickWidget ,第一件事是通過rootObject()方法獲取顯示QQuickWidget的項目,然后查找名為mapItem的子mapItem並調用mapItem的方法:

void MainWindow::on_btnUpdatePos_clicked()
{
    QQuickItem *item = ui->quickWidget->rootObject();
    QObject *object = item->findChild<QObject*>("mapItem");
    QVariant posx = QVariant(-12.0464);
    QVariant posy = QVariant(-77.0428);

    if(object != NULL){
        QMetaObject::invokeMethod(object, "recenter",
                                  Q_ARG(QVariant, posx),
                                  Q_ARG(QVariant, posy));
    }
}

完整的示例可以在以下鏈接中找到

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM