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.setHtml() 加载 HTML 文件
如何将 swf 文件从内存加载到 QWebEngineView
QWebEngineView加载url后直接点击链接没有反应要怎么解决