• qt使用QWebEngineView加载百度地图失败


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 我滴天呐我去 2024-03-10 00:27 采纳率: 33.3% 浏览 6 首页/ 编程语言 / qt使用QWebEngineView加载百度地图失败 qtc++百度 使用qt加载百度地图,在网上找了一个html文件,使用QWebEngineView进行加载,结果只能显示出一半,具体地图样式显示不出来。然后报错这个"Access to XMLHttpRequest at 'https://miao.baidu.com/abdr?_o=file%3A%2F%2F%27 from origin 'file://' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.", source: file:///E:/build-QtWebMap-Desktop_Qt_5_14_2_MSVC2017_32bit-Debug/debug/Demo.html (0),请问有没有懂行的人能告诉一下这个是为什么嘛?是我html文件写错了还是我那个百度地图的密钥ak搞错了。 最终只能显示到这个程度,上面这个报错一出来直接没了 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • 专家-赤兔[在线] 2024-03-10 00:27
      关注

      引自免费微信小程序:皆我百晓生

      在Qt中使用QWebEngineView加载百度地图时遇到的CORS策略错误,通常是因为浏览器的安全策略阻止了从本地文件系统(file://)发起的请求获取远程服务器资源。百度地图API服务端要求必须设置正确的Access-Control-Allow-Origin头部来允许特定来源的请求访问其数据。

      针对您所描述的问题,有以下解决方案:

      1. HTML文件修改: 确保您的HTML文件正确引用了百度地图JavaScript API,并设置了有效的ak(密钥)。通常引用方式如下:
      
      
      
          
          
          
          
          百度地图显示
      
      
          

      请确保将 YOUR_API_KEY 替换为实际申请到的百度地图API密钥。

      1. 开发模式与部署: 在开发过程中,直接通过QWebEngineView加载本地HTML并尝试访问网络资源确实会受到CORS限制。为了调试和测试,请将项目部署到本地web服务器(如Python的SimpleHTTPServer或Node.js的http-server模块),然后用localhost地址加载页面,例如:http://localhost:8080/yourfile.html

      2. CORS头配置: 如果您拥有对远程服务器的控制权,可以在服务器端设置响应头Access-Control-Allow-Origin以允许来自特定源(包括本地)的请求。然而,对于百度地图这样的第三方服务,我们无法更改其服务器配置。

      综上所述,最直接且可行的方案是将HTML文件部署到本地web服务器进行调试和测试。当应用最终打包发布时,也可以考虑将HTML和相关资源嵌入到Qt资源系统中,并通过QWebEngineView加载内嵌资源的方式避免CORS问题。

      展开全部

      评论 编辑记录
    • 檀越剑指大厂 Java领域优质创作者 2024-03-10 00:27
      关注

      我滴天呐我去 上午好☀️☀️☀️️
      本答案参考ChatGPT-3.5

      你遇到的问题是由于CORS(跨源资源共享)策略导致的。当你通过QWebEngineView从本地文件系统(file://)加载HTML文件并尝试访问外部资源(如百度地图API),浏览器会因为安全原因阻止这种跨域请求,除非服务器明确允许这样做。

      针对你的问题,有以下解决方案:

      1. 在开发阶段,如果你只是想临时解决这个问题以进行测试,可以考虑使用一个支持 CORS 的本地HTTP服务器来提供HTML文件,例如使用 Python 内置的 http.server 模块:

        python -m http.server 8000
        

        然后将QWebEngineView指向 http://localhost:8000/yourfile.html 来加载页面。

      2. 修改HTML代码:尽管百度地图API可能不支持直接从file协议发起的请求,但你可以检查HTML中的JavaScript代码是否正确设置了请求头或密钥AK。确保你的请求中没有启用withCredentials属性,或者尝试在无cookie模式下发起请求。

      3. 部署到web服务器:在产品环境中,你应该将HTML文件部署到一个标准的web服务器上,并确保服务器配置了正确的CORS策略,允许你的应用域名访问百度地图API。

      4. 联系百度地图服务提供商:确认他们是否支持从file协议发起的请求,如果不支持,则需要按上述建议进行调整。

      总之,问题的核心在于浏览器的安全策略限制了本地文件系统与远程API之间的交互,你需要改变文件加载方式或调整API调用设置以适应这些策略。

      评论
    • GISer Liu 2024-03-10 02:34
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      根据你提供的信息,问题出现在加载百度地图时遇到了跨域资源共享(CORS)的问题。具体来说,你的网页试图通过XMLHttpRequest加载百度地图服务,但由于跨域限制,浏览器拒绝了这个请求,报错显示了相关信息。
      解决这个问题的思路是,在加载百度地图服务时,确保你的请求不会被浏览器拦截。你可以通过以下几种方法来解决:

      1. 使用正确的百度地图密钥(AK) :确保你在代码中正确配置了百度地图的密钥(AK)。如果密钥错误或过期,可能导致地图加载失败或显示不完整。
      2. 检查网页协议 :你的网页是通过本地文件方式(file://)打开的,而百度地图服务需要通过HTTPS加载。尝试将网页部署到一个支持HTTPS的服务器上,并通过HTTP协议访问网页,这样可以避免跨域问题。
      3. 调整请求头或使用代理 :如果你无法更改网页协议,你可以尝试通过设置请求头或使用代理来解决跨域问题。在请求中添加合适的Access-Control-Allow-Origin头部信息,或者通过设置代理服务器来转发请求。
      4. 使用百度地图JavaScript API :考虑使用百度地图官方提供的JavaScript API来加载地图,这样可以避免跨域问题,同时也更容易与百度地图的服务进行集成和定制。
        根据你的情况,最可能的原因是网页协议不匹配导致的跨域问题。尝试将网页部署到支持HTTPS的服务器上,并通过HTTP协议进行访问,同时确保正确配置了百度地图的密钥。如果问题仍然存在,可以考虑使用其他方法来解决跨域问题,或者使用百度地图的JavaScript
        API来加载地图。
        如果你能提供更多关于你的代码和环境的信息,我可以更具体地帮助你解决这个问题。

      如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

      用户答题指南

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    数据库系统原理题-期末
    初识网络之http协议
    计算机毕业设计Java医疗机构药房管理系统软件开发(源码+系统+mysql数据库+lw文档)
    SpringBoot 接口数据加解密技巧
    业内人士真心话:只会测试没有前途的,我慌了......
    KdMapper扩展实现之SOKNO S.R.L(speedfan.sys)
    Vue3 Composition API(案例)
    LeetCode刷题---141. 环形链表(双指针-滑动窗口)
    IO流(JAVA)
    时代潮流-云原生数据库的崛起
  • 原文地址:https://ask.csdn.net/questions/8071132