QWebEngineView 不加载 Openlayers

Posted

技术标签:

【中文标题】QWebEngineView 不加载 Openlayers【英文标题】:QWebEngineView not load Openlayers 【发布时间】:2021-06-17 17:07:21 【问题描述】:

我尝试使用 QWebEngineView 和 Openlayers 做一个基本示例,但它不起作用。

我的步骤:

    我从 Openlayers 用 html 创建了基本示例

<!doctype html>
<html lang="en">
  <head>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.5.0/css/ol.css" type="text/css">
    <style>
      .map 
        height: 400px;
        width: 100%;
      
    </style>
    <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.5.0/build/ol.js"></script>
    <title>OpenLayers example</title>
  </head>
  <body>
    <h2>My Map</h2>
    <div id="map" class="map"></div>
    <script type="text/javascript">
      var map = new ol.Map(
        target: 'map',
        layers: [
          new ol.layer.Tile(
            source: new ol.source.OSM()
          )
        ],
        view: new ol.View(
          center: ol.proj.fromLonLat([37.41, 8.82]),
          zoom: 4
        )
      );
    </script>
  </body>
</html>

这适用于 Chrome。 我在 QT 中使用 pro 文件中的 webenginewidgets 创建了一个新项目。在 MainWindow 中,我输入了以下代码:



    QWebEngineView *view = new QWebEngineView(parent);
    view->page()->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls, true);
    view->page()->settings()->setAttribute(QWebEngineSettings::AutoLoadImages, true);
    view->page()->settings()->setAttribute(QWebEngineSettings::AllowGeolocationOnInsecureOrigins, true);
    view->page()->settings()->setAttribute(QWebEngineSettings::AllowRunningInsecureContent, true);
    view->page()->settings()->setAttribute(QWebEngineSettings::AllowWindowActivationFromJavaScript, true);
    view->load(QUrl::fromLocalFile("C:/TEST/test_webeng/openlayers.html"));
    view->show();

我尝试放置所有这些属性,因为没有它们我会收到这种类型的消息: 从源文件“文件://”访问“https://a.tile.openstreetmap.org/4/10/8.png”的图像已被 CORS 策略阻止:无“访问控制允许源”请求的资源上存在标头。 ", 来源: file: /// C: /TEST/test_webeng/openlayers.html

无论有无属性,地图图像均不显示。

有什么办法吗?

【问题讨论】:

可能有一个 Qt CORS 设置可以解决这个问题,但如果您希望导出地图/图层画布,则仅在 OpenLayers 中需要 CORS,否则您可以使用new ol.source.OSM(crossOrigin: null) 感谢您的回复,此解决方案对我没有帮助,但谢谢。 eyllanesc 给我下面的解决方案! 【参考方案1】:

问题类似于this post 中的问题,但使用的是 openlayers 而不是 openstreetmap,因此解决方案是创建一个注入 Accept-Language 标头的 QWebEngineUrlRequestInterceptor。

class Interceptor: public QWebEngineUrlRequestInterceptor
public:
    using QWebEngineUrlRequestInterceptor::QWebEngineUrlRequestInterceptor;
    void interceptRequest(QWebEngineUrlRequestInfo & info)
        info.setHttpHeader("Accept-Language", "en-US,en;q=0.9,es;q=0.8,de;q=0.7");
    
;
Interceptor *interceptor = new Interceptor(view);
view->page()->profile()->setUrlRequestInterceptor(interceptor);
view->load(QUrl::fromLocalFile("C:/TEST/test_webeng/openlayers.html"));

【讨论】:

以上是关于QWebEngineView 不加载 Openlayers的主要内容,如果未能解决你的问题,请参考以下文章

QWebEngineview 加载网页缓慢

无法使用 QWebEngineView.setHtml() 加载 HTML 文件

如何将 swf 文件从内存加载到 QWebEngineView

QWebEngineView加载url后直接点击链接没有反应要怎么解决

如何在使用 QWebEngineView 'loadFinished' 加载页面后立即更改 html 元素?

如何使用 QWebEngineView 和 qtwebchannel.js 逐步加载 javascript?