Qt QWebEngineView не разрешено загружать локальный ресурс

редактироватьЭто не дубликат. Связанный вопрос обрабатывает секретный вопрос CORS, где браузер не позволяет загружать скрипты из разных источников. Мой вопрос связан с базовой схемой загрузки ресурсов (file:/// против qrc:/).

Я пытаюсь загрузить локальный HTML-документ в QWebEngineView с помощью file:/// схема. 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. Это прекрасно работает сейчас.

Вот обновленный исходный код (обратите внимание на ссылку на ресурс qrc как в C ++, так и в HTML-коде):

#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>

2

Решение

Если мы размещаем относительные пути, это всегда будут маршруты относительно исполняемого файла, поэтому необходимо убедиться, что маршрут существует.

Кажется странным, что я не распознал простой .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);
0

По вопросам рекламы [email protected]