QWebEngineView 不加载 Openlayers
QWebEngineView not load Openlayers
我尝试用 QWebEngineView 和 Openlayers 做一个基本的例子,但它不起作用。
我的步骤:
- 我在 HTML 中从 Openlayers
创建了基本示例
<!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();
</pre>
我尝试添加所有这些属性,因为没有它们我会收到以下类型的消息:
CORS 策略已阻止从来源 'file: //' 访问位于 'https://a.tile.openstreetmap.org/4/10/8.png' 的图像:请求的资源上不存在 'Access-Control-Allow-Origin' header。 ", 来源: 文件: /// C: /TEST/test_webeng/openlayers.html
无论有没有属性,地图图片都不显示。
有什么解决办法吗?
问题与this post中的问题类似,但使用的是openlayers而不是openstreetmap,因此解决方案是创建一个注入Accept-Language header.[=14的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 做一个基本的例子,但它不起作用。
我的步骤:
- 我在 HTML 中从 Openlayers 创建了基本示例
<!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(); </pre>
我尝试添加所有这些属性,因为没有它们我会收到以下类型的消息: CORS 策略已阻止从来源 'file: //' 访问位于 'https://a.tile.openstreetmap.org/4/10/8.png' 的图像:请求的资源上不存在 'Access-Control-Allow-Origin' header。 ", 来源: 文件: /// C: /TEST/test_webeng/openlayers.html
无论有没有属性,地图图片都不显示。
有什么解决办法吗?
问题与this post中的问题类似,但使用的是openlayers而不是openstreetmap,因此解决方案是创建一个注入Accept-Language header.[=14的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"));