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

Любая помощь будет высоко ценится!

0 ответов

Другие вопросы по тегам