我目前正在使用 Qt 5.9 为 Windows 开发一个应用程序,该应用程序使用QWebEngineView
实例在内部显示一些本地 HTML 文件。代码相当简单,我认为它与手头的问题无关:
QWebEngineView *webView = new QWebEngineView(this);
webView->setUrl(QUrl("qrc:/my_view.html"));
这在我的开发机器上很好地工作,在调试和发布配置上。我的应用程序已经投入生产,因此可以使用Qt Installer Framework进行安装。我正在使用windeployqt进行部署。同样,安装的二进制文件可以毫无问题地呈现我机器上的网页。但是,在具有相同操作系统的不同机器上,只要实例化 Web 视图,它就会崩溃。
经过一些调试,这是我的发现:
根据网络引擎上的文档:
Qt WebEngine 需要以下资源文件:
qtwebengine_resources.pak 包含 Chromium 所需的资源。qtwebengine_devtools_resources.pak 包含用于远程调试的工具。qtwebengine_resources_100p.pak 包含适用于低分辨率显示器的图像。qtwebengine_resources_200p.pak 包含适合高 DPI 显示的图像。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
,它甚至不是目标机器上的目录,而是我的开发 PC 上的目录。相反,我认为它应该输出./resources
.
如果我将文档中提到的文件与它应该运行的应用程序二进制文件放在同一目录中,但我希望QLibraryInfo::DataPath
自动检测该目录的位置,而不是看起来是硬编码的价值。
因此,我想问以下问题:
- 我是否正确执行此部署?我从来没有遇到过应用程序无法加载任何类型的 Qt 库的问题,而且文件似乎在它们应该在的位置。
- 究竟如何
QLibraryInfo::location(QLibraryInfo::DataPath)
解决路径?它们是硬编码的值还是在运行时确定的? 让应用程序找到资源的最明智的方法是什么?我正在考虑以下解决方案:
- 手动将文件放在
./resources
靠近应用程序二进制文件的位置。 - 添加
./resources
到搜索路径QCoreApplication::addLibraryPath()
(我不确定它是否会起作用)。 玩弄一个
qt.conf
文件。再次不确定它是否会起作用。编辑:这确实有效。奇怪的是,如果文件被编译为 Qt 资源(如 中:/qt/etc/qt.conf
),它不会,但如果你将文本文件放在应用程序二进制文件中,它会自动使用它。我的文件看起来很简单:[路径]
数据 = ./resources
- 手动将文件放在
任何帮助都感激不尽!