组件完成后,QML地图未给出任何坐标

时间:2019-06-13 09:14:50

标签: qt qml

我正在尝试从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移动时,它将返回有效坐标。

1 个答案:

答案 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