可以在 QML 中的 Map 上绘制带有孔的 MapPolygon 吗?

Posted

技术标签:

【中文标题】可以在 QML 中的 Map 上绘制带有孔的 MapPolygon 吗?【英文标题】:It's possible to draw MapPolygon with a hole on Map in QML? 【发布时间】:2019-07-16 09:52:15 【问题描述】:

在 C++ 中,我可以使用 QPainterPath::subtracted 绘制带孔的多边形,但我不知道在 QML Map 中如何实现。

【问题讨论】:

你使用的是哪个 Qt Location 插件? OpenStreetMap 插件 【参考方案1】:

由于Qt 5.13 可以使用Mapbox GL Plugin,例如使用QGeoPolygon,您也可以使用GeoJSON。例如:

ma​​in.cpp

#include <QGeoPolygon>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

int main(int argc, char *argv[])

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QGeoPolygon polygon;
    polygon.setPath(51.11, 17.13,
                     50.42, 30.54,
                     58.36, 26.70,
                     51.11, 17.13);
    polygon.addHole(54.36, 23.46,
                     51.91, 20.52,
                     51.50, 28.25,
                     54.36, 26.80,
                     54.36, 23.46);

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("poly", QVariant::fromValue(polygon));
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) 
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    , Qt::QueuedConnection);
    engine.load(url);

    return app.exec();

ma​​in.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtLocation 5.13
import QtPositioning 5.13

Window 
    visible: true
    width: 640
    height: 480
    Map 
        anchors.fill: parent
        center: QtPositioning.coordinate(52, 22)
        plugin: Plugin 
            name: "mapboxgl"
        
        zoomLevel: 4
        MapPolygon 
            color: "red"
            border.color: "green"
            border.width: 2
            smooth: true
            opacity: 0.25
            geoShape: poly
        
    

【讨论】:

什么是geoShape?我找不到关于它的文档doc-snapshots.qt.io/qt5-5.13/qml-qtlocation-mappolygon.html @Pavel 正如你最近指出的那样,它已经实现了,所以它似乎还没有被添加到文档中 刚刚运行此代码,但屏幕上什么也没有,应用程序输出显示此消息:“不支持地理服务提供商。”我应该添加/删除什么才能使此代码正常工作?

以上是关于可以在 QML 中的 Map 上绘制带有孔的 MapPolygon 吗?的主要内容,如果未能解决你的问题,请参考以下文章

在PyQt中创建MapQuickItem并将其添加到Map中

使根 QML 组件的功能可被其他组件调用

可以为特定项目禁用 Qt 5.8 中的 QML 缓存吗?

QML如何绘制不同的grabToImage()

带有透明孔的 CALayer

带有透明孔的 CALayer