Qt QWebEngineView不允许加载本地资源

4

编辑: 这不是重复问题。所链接的问题涉及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>

1
你可以展示你的文件结构,记住路径是相对于可执行文件而不是源代码。我建议使用资源.qrc来保存静态文件,比如js文件。 - eyllanesc
@eyllanescOK好的,我会这样做...谢谢你的建议! :) - BigONotation
@eyllanesc 非常感谢!这个方法可行。如果您将您的解决方案作为答案添加,我会接受它 :) - BigONotation
@MrEricSir 不是重复。请参考我在页面顶部的编辑。谢谢。 - BigONotation
显示剩余2条评论
2个回答

2
如果我们使用相对路径,这些路径将始终相对于可执行文件,因此必须确保路径存在。
我觉得很奇怪,我没有识别出一个简单的.js文件,因为我已经使用过许多没有问题的.js文件,但是我将静态文件(html、js、css等)放在资源.qrc文件中,因为它将成为可执行文件的一部分,因此它的路径永远不会改变。

1
如果您需要加载本地资源,则只需将--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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接