最小地图(QML)

使用Qt Quick显示地图的最小代码。

最小地图演示了如何使用地图项来渲染地图。它展示了显示地图所需的最小代码,可以作为进一步实验的基础。

运行示例

要从Qt Creator中运行示例,请打开欢迎模式并从示例中选择示例。有关更多信息,请访问构建和运行示例

C++代码

main.cpp中,我们只使用了QGuiApplicationQQmlApplicationEngine类。

#include <QGuiApplication>
#include <QQmlApplicationEngine>

在主函数中,我们首先实例化一个QGuiApplication对象。然后我们创建一个QQmlApplicationEngine,并告知它从Qt资源系统加载main.qml

最后,QGuiApplication::exec()启动主事件循环。

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

QML代码

main.qml中,我们导入了QtLocation QML模块及其依赖的QtPositioning QML模块。接着,我们创建顶层窗口,设置合理的默认大小,并使其可见。窗口将被显示地图的地图项填充。

import QtQuick
import QtLocation
import QtPositioning

Window {
    width: Qt.platform.os == "android" ? Screen.width : 512
    height: Qt.platform.os == "android" ? Screen.height : 512
    visible: true
    title: map.center + " zoom " + map.zoomLevel.toFixed(3)
           + " min " + map.minimumZoomLevel + " max " + map.maximumZoomLevel

    Plugin {
        id: mapPlugin
        name: "osm"
    }

    Map {
        id: map
        anchors.fill: parent
        plugin: mapPlugin
        center: QtPositioning.coordinate(59.91, 10.75) // Oslo
        zoomLevel: 14
        property geoCoordinate startCentroid

        PinchHandler {
            id: pinch
            target: null
            onActiveChanged: if (active) {
                map.startCentroid = map.toCoordinate(pinch.centroid.position, false)
            }
            onScaleChanged: (delta) => {
                map.zoomLevel += Math.log2(delta)
                map.alignCoordinateToPoint(map.startCentroid, pinch.centroid.position)
            }
            onRotationChanged: (delta) => {
                map.bearing -= delta
                map.alignCoordinateToPoint(map.startCentroid, pinch.centroid.position)
            }
            grabPermissions: PointerHandler.TakeOverForbidden
        }
        WheelHandler {
            id: wheel
            // workaround for QTBUG-87646 / QTBUG-112394 / QTBUG-112432:
            // Magic Mouse pretends to be a trackpad but doesn't work with PinchHandler
            // and we don't yet distinguish mice and trackpads on Wayland either
            acceptedDevices: Qt.platform.pluginName === "cocoa" || Qt.platform.pluginName === "wayland"
                             ? PointerDevice.Mouse | PointerDevice.TouchPad
                             : PointerDevice.Mouse
            rotationScale: 1/120
            property: "zoomLevel"
        }
        DragHandler {
            id: drag
            target: null
            onTranslationChanged: (delta) => map.pan(-delta.x, -delta.y)
        }
        Shortcut {
            enabled: map.zoomLevel < map.maximumZoomLevel
            sequence: StandardKey.ZoomIn
            onActivated: map.zoomLevel = Math.round(map.zoomLevel + 1)
        }
        Shortcut {
            enabled: map.zoomLevel > map.minimumZoomLevel
            sequence: StandardKey.ZoomOut
            onActivated: map.zoomLevel = Math.round(map.zoomLevel - 1)
        }
    }
}

插件项是必要的,以便定义我们打算使用的地图提供者。此示例可以与任何可用的地理服务插件一起工作。然而,某些插件可能需要额外的插件参数才能正确运行,我们可以使用PluginParameter来指定它们。在此示例中,我们使用osm插件,它是一个Qt Location Open Street Map Plugin,不需要任何参数。

地图项中,我们引用了我们使用的插件,并设置了地图的中心缩放级别

要求

该示例需要有效的互联网连接来下载OpenStreetMap地图瓦片。系统代理将被自动选择(如果有的话)。

示例项目 @ code.qt.io

© 2024 Qt公司有限公司。本文档中包含的文档贡献均属各自所有者的版权。提供的文档由自由软件基金会出版,并受GNU自由文档许可协议第1.3版的条款约束。Qt及其相关商标为芬兰及其它在世界各地的Qt公司有限公司的商标。所有其他商标均为各自所有者的财产。