QML 地图只能垂直缩放
QML map zoom only verticaly
Qt 中的地图是否有 属性,因此如果我将鼠标光标移动到地图上的任意位置并尝试使用鼠标滚轮更改缩放级别,它不会移动中心?因为在默认情况下,地图缩放,但将现有中心移向鼠标光标位置(下图示例;如果光标位于显示位置并且我们尝试更改缩放比例,地理标记图片将沿箭头方向移动)。我只需要它从指定的地图中心直接向上放大,而不考虑鼠标光标的位置。
地图说明:
https://doc-snapshots.qt.io/qt5-5.9/qml-qtlocation-map.html
QML代码
import QtQuick 2.0
import QtQuick.Window 2.0
import QtLocation 5.6
import QtPositioning 5.6
Item{
id: itemControl
objectName: "itemControl"
width: 512
height: 512
visible: true
Plugin {
id: mapPlugin
PluginParameter { name: "osm.useragent"; value: "usermap" }
name: "esri"
}
Map {
id:map
gesture.enabled: true
gesture.acceptedGestures: MapGestureArea.PinchGesture | MapGestureArea.PanGesture
objectName: "map"
anchors.fill: parent
bearing: 0
width: 512
height: 512
plugin: mapPlugin
center {
latitude: 45.525180446
longitude: 13.5575992170
}
zoomLevel: 15
//If user doubleclicks on map update coordinates of pixel to coordinates on UI
signal qmlSignalUpdateLat(string msg)
signal qmlSignalUpdateLon(string msg)
MouseArea
{
id: mousearea
hoverEnabled: true
anchors.fill: parent
acceptedButtons: Qt.LeftButton
onDoubleClicked: {
map.center.latitude = map.toCoordinate(Qt.point(mouseX,mouseY)).latitude
map.center.longitude = map.toCoordinate(Qt.point(mouseX,mouseY)).longitude
map.qmlSignalUpdateLat(map.center.latitude)
map.qmlSignalUpdateLon(map.center.longitude)
}
}
function updateMap(lat,lon,bear){
map.center.latitude = lat;
map.center.longtitude = lon;
map.bearing = bear;
}
}
}
可能应该有更优雅的解决方案,但这里是您的代码简化:
import QtQuick 2.0
import QtQuick.Window 2.0
import QtLocation 5.6
import QtPositioning 5.6
Window {
width: 512
height: 512
visible: true
Plugin {
id: mapPlugin
PluginParameter { name: "osm.useragent"; value: "usermap" }
name: "esri"
}
Location {
// Define location that will be "center" of map
id: mapCenter
coordinate {
latitude: 45.525180446
longitude: 13.5575992170
}
}
Map {
id: map
anchors.fill: parent
plugin: mapPlugin
center: mapCenter.coordinate
onCenterChanged: {
// As soon as map center changed -- we'll check if coordinates differs from our
// mapCenter coordinates and if so, set map center coordinates equal to mapCenter
if (map.center != mapCenter.coordinate) {
map.center = mapCenter.coordinate
}
}
MapCircle {
// Circle just for ability to check if it zooms correctly
center: mapCenter.coordinate
radius: 500.0
color: "green"
border.width: 3
}
}
}
这背后的主要思想是控制地图 center
的每次更改。如果它发生变化 - 检查天气是否等于我们的中心。如果它不等于我们想要的中心mapCenter
——我们改变它。
结果:
Qt 中的地图是否有 属性,因此如果我将鼠标光标移动到地图上的任意位置并尝试使用鼠标滚轮更改缩放级别,它不会移动中心?因为在默认情况下,地图缩放,但将现有中心移向鼠标光标位置(下图示例;如果光标位于显示位置并且我们尝试更改缩放比例,地理标记图片将沿箭头方向移动)。我只需要它从指定的地图中心直接向上放大,而不考虑鼠标光标的位置。
地图说明: https://doc-snapshots.qt.io/qt5-5.9/qml-qtlocation-map.html
QML代码
import QtQuick 2.0
import QtQuick.Window 2.0
import QtLocation 5.6
import QtPositioning 5.6
Item{
id: itemControl
objectName: "itemControl"
width: 512
height: 512
visible: true
Plugin {
id: mapPlugin
PluginParameter { name: "osm.useragent"; value: "usermap" }
name: "esri"
}
Map {
id:map
gesture.enabled: true
gesture.acceptedGestures: MapGestureArea.PinchGesture | MapGestureArea.PanGesture
objectName: "map"
anchors.fill: parent
bearing: 0
width: 512
height: 512
plugin: mapPlugin
center {
latitude: 45.525180446
longitude: 13.5575992170
}
zoomLevel: 15
//If user doubleclicks on map update coordinates of pixel to coordinates on UI
signal qmlSignalUpdateLat(string msg)
signal qmlSignalUpdateLon(string msg)
MouseArea
{
id: mousearea
hoverEnabled: true
anchors.fill: parent
acceptedButtons: Qt.LeftButton
onDoubleClicked: {
map.center.latitude = map.toCoordinate(Qt.point(mouseX,mouseY)).latitude
map.center.longitude = map.toCoordinate(Qt.point(mouseX,mouseY)).longitude
map.qmlSignalUpdateLat(map.center.latitude)
map.qmlSignalUpdateLon(map.center.longitude)
}
}
function updateMap(lat,lon,bear){
map.center.latitude = lat;
map.center.longtitude = lon;
map.bearing = bear;
}
}
}
可能应该有更优雅的解决方案,但这里是您的代码简化:
import QtQuick 2.0
import QtQuick.Window 2.0
import QtLocation 5.6
import QtPositioning 5.6
Window {
width: 512
height: 512
visible: true
Plugin {
id: mapPlugin
PluginParameter { name: "osm.useragent"; value: "usermap" }
name: "esri"
}
Location {
// Define location that will be "center" of map
id: mapCenter
coordinate {
latitude: 45.525180446
longitude: 13.5575992170
}
}
Map {
id: map
anchors.fill: parent
plugin: mapPlugin
center: mapCenter.coordinate
onCenterChanged: {
// As soon as map center changed -- we'll check if coordinates differs from our
// mapCenter coordinates and if so, set map center coordinates equal to mapCenter
if (map.center != mapCenter.coordinate) {
map.center = mapCenter.coordinate
}
}
MapCircle {
// Circle just for ability to check if it zooms correctly
center: mapCenter.coordinate
radius: 500.0
color: "green"
border.width: 3
}
}
}
这背后的主要思想是控制地图 center
的每次更改。如果它发生变化 - 检查天气是否等于我们的中心。如果它不等于我们想要的中心mapCenter
——我们改变它。
结果: