在我的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 ++代码中是否有错误?
答案 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
中找到