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