我目前正在使用Qt 5.9开发一个Windows应用程序,它使用QWebEngineView
实例在里面显示一些本地HTML文件。代码相当简单,我不认为它与手头的问题有关:
QWebEngineView *webView = new QWebEngineView(this);
webView->setUrl(QUrl("qrc:/my_view.html"));
这在我的开发机器上很好地适用于调试和发布配置。我的应用程序已经开始生产,因此可以使用Qt Installer Framework进行安装。我正在使用windeployqt进行部署。同样,已安装的二进制文件可以在我的机器上呈现网页而不会出现问题。但是,在具有相同操作系统的其他计算机上,只要实例化Web视图,它就会崩溃。
经过一些调试,以下是我的发现:
根据网络引擎上的the documentation:
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
这清楚地表明理论上Web引擎文件位置正确。我尝试调试QLibraryInfo::location(QLibraryInfo::DataPath)
的值,它产生了C:/Qt/Qt5.9.2/5.9.2/msvc2017_64
,它甚至不是目标机器上的目录,而是在我的开发PC上。相反,我认为它应该输出./resources
。
如果我将文档中提到的文件放在与应用程序二进制文件相同的目录中,它应该按原样运行,但我希望QLibraryInfo::DataPath
能够自动检测此目录的位置,而不是它是一个硬编码的值。
因此我想问以下问题:
QLibraryInfo::location(QLibraryInfo::DataPath)
如何准确解析路径?它们是硬编码值还是在运行时确定?让应用程序找到资源的最明智的方法是什么?我在考虑以下解决方案:
./resources
下的文件放在应用程序二进制文件附近。QCoreApplication::addLibraryPath()
将./resources
添加到搜索路径中(我不确定它是否有效)。使用qt.conf
文件。再次不确定它是否会起作用。 已编辑:这确实有效。奇怪的是,如果文件被编译为Qt资源(如:/qt/etc/qt.conf
),则不会,但如果将文本文件放在应用程序二进制文件中,它将自动使用它。我的文件看起来像这样:
[路径]
数据= ./resources
非常感谢任何帮助!