Qt Qml,在 iOS 上将地图(OSM Mapbox Mapboxgl)嵌入到 QQuickWidget C++ 对象中

Posted

技术标签:

【中文标题】Qt Qml,在 iOS 上将地图(OSM Mapbox Mapboxgl)嵌入到 QQuickWidget C++ 对象中【英文标题】:Qt Qml, embedding a map (OSM Mapbox Mapboxgl) into a QQuickWidget C++ object, on iOS 【发布时间】:2017-11-15 07:16:38 【问题描述】:

我正在开发一个必须显示地图的跨平台移动应用程序。那么我们使用的是Qt框架(Qt 5.9),实现的主要部分是C++。

Qt 在 QML 中有现成可用的 Map 对象。然后,我发现集成地图视图的最佳方法是将 QML 代码加载到 QQuickWidget 中。

以下代码在 MacOS 桌面上运行良好,但在 ios 上部署时我仍然得到一个空白视图。

ma​​p.qml

import QtQuick 2.0
import QtQuick.Controls 1.4
import QtLocation 5.9
import QtPositioning 5.5

Map 
    id: map
    plugin: Plugin 
        name: "mapboxgl"
        PluginParameter  name: "mapboxgl.access_token"; value: "***" 
    

    center: QtPositioning.coordinate(60.170448, 24.942046) // Helsinki
    zoomLevel: 8

    width: 500  // no effects since it will be resized
    height: 500 // no effects since it will be resized
    gesture.enabled: true

    Component.onCompleted: 
        console.log("Dimensions: ", width, height) // print 500 500 whether or not the map is displayed
    

viewport.cpp

Viewport::Viewport(QWidget *parent) : QWidget(parent),
    _engine(new QQmlEngine(this)),
    _mapview(new QQuickWidget(_engine,this)),
    _toolbar(new Toolbar(this)) // subclass of QWidget

    _mapview->setSource(QUrl("qrc:/map.qml"));
    _mapview->setResizeMode(QQuickWidget::SizeRootObjectToView);

注意:

map.qml 在 qt 资源文件的根目录中正确声明,以便移动设备可以访问它。我知道 mapboxgl 插件在 Qt 5.9 上是非常新的无论我为地图使用什么插件(osm、mapbox、mapboxgl),我在 iOS 上总是得到一个空白视图,没有错误消息。 运行简单示例项目时,mapboxgl 插件的警告消息类似于ssl handshake failed。尽管 Qt 说 mapboxgl QML 插件支持 iOS。 Viewport 类继承自 QWidget,并且不与任何 ui 文件关联,_mapview_toolbar 几何图形都是手动管理的。目前没有重叠的小部件,它们都是完全不透明的。尽管如此,我还是尝试设置/取消设置几个 OpenGL 属性(Qt::AA_UseOpenGLESQt::AA_ShareOpenGLContexts 等...)但仍然没有这样做... 最后一点:用一个简单的红色矩形替换上面代码的地图,上面有一个文本效果很好。

我的问题是我做错了什么?我错过了文档中的某些内容吗?没有说 iOS 不能支持这些地图 qml 对象。

【问题讨论】:

【参考方案1】:

这似乎是由于 Qt 5.9.0 的 iOS 的 SSL 套接字处理中的一个错误 - https://bugreports.qt.io/browse/QTBUG-61053

在尝试使用 osm highdpi 切片或使用 mapboxgl 时,我在调试输出中看到“SSL 握手失败”。

我打开在线安装程序,添加 Qt 5.9.1 iOS,等待下载,然后为 5.9.1 iOS 重新配置项目并运行。

【讨论】:

我更新到 Qt 5.9.1,我没有注意到“SSL 握手失败”消息是否消失了。虽然我能够在一个新的普通 QML 应用程序项目中获取地图。但不是在我的项目中,地图嵌入到 QQuickWidget 中。

以上是关于Qt Qml,在 iOS 上将地图(OSM Mapbox Mapboxgl)嵌入到 QQuickWidget C++ 对象中的主要内容,如果未能解决你的问题,请参考以下文章

QT QML QtLocation 地图插件

QML/OSM。如何显示圆圈?

QT / QML如何在地图上运行mapReady?

在QT / QML中是否有IOS的visibleMapRect?

Qt/Qml:如何包含地图瓦片以供离线使用?

设置Qt位置以从本地osm服务器进行查询