我正在尝试从QML组件Map
获取两个坐标。我尝试使用标准的Component.onCompleted
。我试图获取位于左上方的坐标和位于右下方的坐标。
我正在使用Map
作为参数的toCoordinate
函数Qt.Point()
。
调用函数时出现问题,因为该函数的输出为空。
我正在使用Qt 5.12.3。
输出:
qml:
qml:
我的代码
import QtQuick 2.12
import QtQuick.Window 2.12
import QtLocation 5.9
import QtPositioning 5.3
Window {
visible: true
width: 640
height: 480
Map {
id: map
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
height: parent.height + 20
plugin: mapPlugin
gesture.acceptedGestures: {
MapGestureArea.PanGesture |
MapGestureArea.PinchGesture
}
Component.onCompleted: {
console.log(map.toCoordinate(Qt.point(0,0)))
console.log(map.toCoordinate(Qt.point(map.width, map.height)))
}
}
Plugin {
id: mapPlugin
name: "osm"
PluginParameter {
name: "osm.mapping.cache.directory"
value: "./cache/"
}
}
}
这个问题有解决方案吗?有人有类似的问题吗?
谢谢您的帮助。
//编辑:
当我在map.toCoordinate(Qt.point(0,0))
中使用Map.onCenterChanged
然后用Map
移动时,它将返回有效坐标。
答案 0 :(得分:2)
the docs指出:
mapReady:bool
此属性保存地图是否已成功初始化 并准备使用。一些方法,例如fromCoordinate和 toCoordinate,在地图准备好之前将无法使用。 由于 地图的架构,建议将发射的信号用于 此属性代替Component.onCompleted,以确保 一切都按预期进行。
(重点是我的)
Component.onCompleted不保证地图已渲染或具有API提供的信息,而是必须使用mapReady属性:
Map {
id: map
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
height: parent.height + 20
plugin: mapPlugin
gesture.acceptedGestures: {
MapGestureArea.PanGesture |
MapGestureArea.PinchGesture
}
onMapReadyChanged: {
if(mapReady){
console.log(map.toCoordinate(Qt.point(0,0)))
console.log(map.toCoordinate(Qt.point(map.width, map.height)))
}
}
}
输出:
qml: 51° 32' 29.3" N, 1° 53' 7.8" W, 0m
qml: 51° 28' 23.1" N, 1° 37' 48.4" E, 0m