QWebEngineView аварийно завершает работу при сборке релизов Windows, так как не может найти необходимые файлы ресурсов
В настоящее время я разрабатываю приложение для Windows с использованием Qt 5.9, которое отображает некоторые локальные файлы HTML внутри, используя QWebEngineView
пример. Код довольно прост, и я не думаю, что он имеет отношение к рассматриваемой проблеме:
QWebEngineView *webView = new QWebEngineView(this);
webView->setUrl(QUrl("qrc:/my_view.html"));
Это прекрасно работает на моей машине для разработки, как в конфигурации отладки, так и в конфигурации выпуска. Мое приложение уже запущено и может быть установлено с помощью Qt Installer Framework. Я использую windeployqt для развертывания. Опять же, установленный двоичный файл работает без каких-либо проблем. Однако на другом компьютере с той же ОС он будет аварийно завершать работу всякий раз, когда создается веб-представление.
После некоторой отладки вот мои открытия:
Согласно документации на веб-движке:
Qt WebEngine требует следующие файлы ресурсов:
qtwebengine_resources.pak содержит ресурсы, необходимые для Chromium. qtwebengine_devtools_resources.pak содержит инструменты для удаленной отладки. qtwebengine_resources_100p.pak содержит изображения, подходящие для дисплеев с низким разрешением. qtwebengine_resources_200p.pak содержит изображения, подходящие для дисплеев с высоким разрешением. icudtl.dat обеспечивает поддержку международных компонентов для Unicode (ICU). Это версия ICU Chromium, которая не нужна, если Qt WebEngine был сконфигурирован для использования системного ICU.
Поиск ресурсов осуществляется в следующих местах:
В Linux и Windows: каталог ресурсов в каталоге, заданном QLibraryInfo::location(QLibraryInfo::DataPath)
Что я нашел странным, так как вывод каталога приложения дает следующее (обрезано для удобства):
│ app.exe
| <other libraries>
│ Qt5WebChannel.dll
│ Qt5WebEngineCore.dll
│ Qt5WebEngineWidgets.dll
│ QtWebEngineProcess.exe
│
├───bearer
│
├───iconengines
│
├───imageformats
│
├───Licenses
│
├───platforms
│
├───position
│
├───printsupport
│
├───resources
│ icudtl.dat
│ qtwebengine_devtools_resources.pak
│ qtwebengine_resources.pak
│ qtwebengine_resources_100p.pak
│ qtwebengine_resources_200p.pak
│
├───sqldrivers
│
└───translations
└───qtwebengine_locales
Что ясно показывает, что файлы веб-движка в теории правильно расположены. Я попытался отладить значение QLibraryInfo::location(QLibraryInfo::DataPath)
и это дало C:/Qt/Qt5.9.2/5.9.2/msvc2017_64
, который даже не каталог на целевой машине, а скорее на моем компьютере для разработки. Вместо этого я думаю, что это должно вывести путь к ./resources
,
Если я поместу файлы, упомянутые в документации, в тот же каталог, что и двоичный файл приложения, он будет работать так, как должен, но я бы ожидал, что QLibraryInfo::DataPath
автоматически определять, где находится этот каталог, а не, по внешнему виду, быть жестко закодированным значением.
Поэтому я хотел бы спросить следующее:
- Я правильно делаю это развертывание? У меня никогда не было проблем с тем, что приложение не может загружать библиотеки Qt любого вида, и файлы, кажется, находятся там, где они должны быть.
- Как
QLibraryInfo::location(QLibraryInfo::DataPath)
точно разрешить пути? Это жестко закодированные значения или они определены во время выполнения? Какой самый разумный способ заставить приложение найти ресурсы? Я думаю о следующих решениях:
- Поместите файлы вручную
./resources
близко к двоичному приложению. - Добавление
./resources
к пути поиска сQCoreApplication::addLibraryPath()
(Я не уверен, что это будет работать). Поиграй с
qt.conf
файл. Опять не уверен, будет ли это работать. Отредактировано: это действительно работает. Как ни странно, этого не произошло, если файл был скомпилирован как ресурс Qt (как в:/qt/etc/qt.conf
), но если вы поместите текстовый файл вдоль двоичного файла приложения, он будет автоматически его использовать. Мой файл выглядит просто так:[Путь]
Данные = ./resources
- Поместите файлы вручную
Любая помощь будет высоко ценится!