【发布时间】: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 对象。
【问题讨论】: