Может ли QWebView загружать *.js из файлов ресурсов Qt и запускать их?
У меня есть файл qrc, который выглядит так:
<qresource prefix="/web">
<file alias="assets.js">../web/assets.js</file>
<file alias="index.html">../web/index.html</file>
</qresource>
Внутри assets.js Просто добавляем функцию для всплывающих окон:
function myFunction()
{
window.alert("Hello from assets.js");
}
Внутри index.html добавим еще один javascript для всплывающего окна с предупреждением, загрузим assets.js и добавим 2 кнопки. Первый - для вызова всплывающего окна из внешнего файла javascript (assets.js), а второй - для вызова javascript, встраиваемого в файл index.html:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script>
function localFunction()
{
window.alert('HTML loaded');
}
</script>
<script src="assets.js"></script>
<button onclick="myFunction()">External JS</button>
<button onclick="localFunction()">Local JS</button>
</body>
</html>
Теперь, когда я пытаюсь загрузить index.html в qtwebkit:
webView->load(QUrl(QStringLiteral("qrc:/web/index.html")));
Я вижу, что index.html был загружен нормально (я вижу 2 кнопки). При нажатии на кнопку, которая должна вызывать локальный (html embeded) javascript, он работает. Нажатие на вторую кнопку ничего не делает.
Кажется, что внешние assets.js не загружен должным образом. Любые предположения, как я могу заставить это работать?
Благодарю.
1 ответ
Javascript не оценивается из HTML. Ваш файл JS не может быть найден. Следующее не имеет никакого эффекта:
<script src="assets.js"></script>
Попробуйте это явно:
const QString js = readFile("qrc:/web/assets.js"); // Load your javascript file
view->page()->mainFrame()->evaluateJavaScript(js);
Другое решение, более эффективное: используйте систему QRC и установите baseUrl в setHtml, чтобы правильно связать все файлы:
const QString html = readFile(":/index.html");
view->setHtml(html, QUrl("qrc:/"));