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 上部署时我仍然得到一个空白视图。
map.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_UseOpenGLES
、Qt::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++ 对象中的主要内容,如果未能解决你的问题,请参考以下文章