【问题标题】:Qt QWebEngineView not allowed to load local resourceQt QWebEngineView 不允许加载本地资源
【发布时间】:2017-08-27 21:26:49
【问题描述】:

编辑:这不是重复的。链接的问题处理一个 CORS 安全问题,其中浏览器不允许您从不同来源加载脚本。我的问题与基本的资源加载方案有关(file:/// vs qrc:/)。

我正在尝试使用 file:/// 方案在 QWebEngineView 中加载本地 html 文档。 html 文件还引用了本地存储的 jquery 库。页面加载代码如下:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow w;

    // center window on desktop
    w.setGeometry(QStyle::alignedRect(
                      Qt::LeftToRight,
                      Qt::AlignCenter,
                      w.size(),
                      a.desktop()->availableGeometry()
                      ));

    // Add WebEngineView
    QWebEngineView* view = new QWebEngineView;
    QWebEngineSettings* settings = view->settings();
    settings->setAttribute(QWebEngineSettings::LocalContentCanAccessFileUrls, true);
    settings->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls,true);

    view->setUrl(QUrl(QStringLiteral("file:///app/ui/main.html")));

    // Make it the one and only widget
    w.setCentralWidget(view);

    w.show();

    return a.exec();
}

接下来是极简的html文档:

<html>
<head>
<script src="libs/jquery-3.2.1.min.js"/>
</head>
<body>
<h2>Hello World</h2>
<script>
$(function() {
  alert('loaded');
});
</script>
</body>
</html>

文档加载正常,但 JavaScript 失败并出现以下错误:

js: Not allowed to load local resource

如何强制 QWebEngineView 加载并执行脚本?

编辑:我按照@eyllanesc 的建议进行操作,并将所有文件添加为 qrc 资源。这现在工作得很好。

这是更新后的源代码(注意 C++ 和 HTML 代码中对 qrc 资源的引用):

#include "mainwindow.h"
#include <QApplication>
#include <QWebEngineView>
#include <QStyle>
#include <QDesktopWidget>
#include <QWebEngineSettings>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow w;

    // center window on desktop
    w.setGeometry(QStyle::alignedRect(
                      Qt::LeftToRight,
                      Qt::AlignCenter,
                      w.size(),
                      a.desktop()->availableGeometry()
                      ));

    // Add WebEngineView
    QWebEngineView* view = new QWebEngineView;
    QWebEngineSettings* settings = view->settings();

    //settings->setAttribute(QWebEngineSettings::LocalContentCanAccessFileUrls, true);
    //settings->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls,true);

    view->setUrl(QUrl("qrc:/ui/main.html"));

    // Make it the one and only widget
    w.setCentralWidget(view);

    w.show();

    return a.exec();
}

以及对应的html文件:

<html>
<head>
  <script src="qrc:/ui/libs/jquery-3.2.1.min.js"></script>
</head>
<body>
<h2>Hello World</h2>
<script>
$(function() {
    alert( "Document ready!" );
});
</script>
</body>
</html>

【问题讨论】:

  • 你可以显示文件的结构,记住路由是相对于可执行文件的,而不是相对于源代码的。我建议使用资源 .qrc 来保存像 js 这样的静态文件。
  • @eyllanesc 这不是相对路径问题。 JavaScript 文件已正确找到,但无法执行。一定还有其他设置
  • 我已经多次运行类似于你的代码并且我没有遇到问题(不同之处在于我使用.qrc)。您可以通过 github、drive 或 dropbox 共享您的代码,因为正如您现在描述的那样,我不知道 .html 或 .js 在哪里
  • @eyllanescOK 会这样做...感谢您的建议! :)

标签: c++ qt qt5 qwebview qwebengineview


【解决方案1】:

如果我们放置相对路径,这些将始终是相对于可执行文件的路由,因此有必要确保该路由存在。

我不认识一个简单的 .js 似乎很奇怪,因为我使用过很多都没有问题,但是我将静态(html、js、css 等)放在资源 .qrc 中,因为这将是可执行文件的一部分因此它的 Route 永远不会改变。

【讨论】:

    【解决方案2】:

    如果需要加载本地资源,则只需将--disable-web-security参数传递给QApplication,例如:

    char ARG_DISABLE_WEB_SECURITY[] = "--disable-web-security";
    int newArgc = argc+1+1;
    char** newArgv = new char*[newArgc];
    for(int i=0; i<argc; i++) {
        newArgv[i] = argv[i];
    }
    newArgv[argc] = ARG_DISABLE_WEB_SECURITY;
    newArgv[argc+1] = nullptr;
    
    QApplication myApplication(newArgc, newArgv);
    

    【讨论】:

      猜你喜欢
      • 2016-10-08
      • 2016-11-04
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多