[英]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.