【问题标题】:Qt Qml, embedding a map (OSM Mapbox Mapboxgl) into a QQuickWidget C++ object, on iOSQt Qml,在 iOS 上将地图(OSM Mapbox Mapboxgl)嵌入到 QQuickWidget C++ 对象中
【发布时间】: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 对象。

【问题讨论】:

    标签: c++ ios qt 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 中。
    猜你喜欢
    • 2018-04-16
    • 2021-11-07
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多