我已经构建了一个静态Qt库,并希望使用它与独立的exe部署我的应用程序。经过一天的努力,我已经知道qtquick插件不能是静态包含到exe中。
我需要将qml
文件夹中的一些文件夹复制到我的exe目录,让exe可以显示GUI。
所以我想知道我的exe需要哪个文件,我逐个删除这些文件夹中的文件以使其知晓。真正需要的文件只是plugins.QMLTYPES
文件和qmldir
文件。
然后我发现QQmlApplicationEngine
的导入路径可以更改,我输出QQmlApplicationEngine.importPathList()
,其中一个路径只是Qt安装路径中的qml
文件夹。 所以我认为这是Qt获取plugins.QMLTYPES
文件和qmldir
文件的搜索路径的地方。
如果我认为只是正确的话,我可以将我需要的文件夹复制到qrc
文件中并使用QQmlApplicationEngine.addImportPath("qrc:/foldersIwant")
让exe可以在运行时导入它所需的内容。因为qrc
被编译成exe,我可以摆脱这些文件夹,让我的exe独立。
但是在我的代码中执行此操作之后,即使QQmlApplicationEngine.importPathList()
的输出具有我放入的路径,app仍然无法找到所需的文件,并且我还根据Load qmldir from QRC file检查了我的路径
以下是代码:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.addImportPath(QStringLiteral("qrc:/import/qtquick/"));
qDebug()<<engine.importPathList();
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
return app.exec();
}
这是我的qrc文件的一部分
我的演绎中有什么不对吗?
进一步研究:
我已添加
engine.addImportPath(QDir::currentPath() + QDir::separator() + "custom");
并将所有文件夹移到custom
个文件夹中,它可以成功运行。并且没有此行的exe无法与custom
文件夹一起运行。所以我想知道“搜索”行为不能应用于qrc
文件?
答案 0 :(得分:1)
最后,我得到了答案。结果显示我的所有想法都是正确!
以下是我尝试过的内容,你可以阅读结尾以获得明确的步骤。
我的目标是编译一个独立的qml2应用程序exe。
在qml1中,我可以构建静态Qt库并用它编译我的应用程序。
在qml2中,exe可以用相同的方式编译。但如果我在没有Qt-Runtime的情况下运行它。它只是没有在Windows操作系统上显示任何窗口(并且在其他操作系统中也没有显示任何内容)。我搜索了这么多信息,发现这个问题困扰了很多人,因为Qt5.0。现在是Qt5.5,他们仍然没有修复它。 所以我需要将QT_INSTALLED_PREFIX/qml
中的文件夹复制到我的应用的根目录,让我的应用显示GUI。
通过问题将在Qt5.6(https://codereview.qt-project.org/#/c/114835/)中解决,我不能等待这么久(Qt5.6将在今年年底发布)。所以我决定自己打包文件。
我偶然看到这个问题:Load qmldir from QRC file。它告诉我qmldir文件可以包含到qrc文件中,Qml引擎可以搜索到那些目录。所以我认为,QML文件也可以包含在qrc文件中。
但首先要找到导入qml2的位置,当我查看QQmlApplicationEngine的文档时,我找到了addImportPath
函数,我告诉自己必须找到导入路径的关键。该文件告诉我一切:
QStringList QQmlEngine :: importPathList()
const返回
的列表 引擎在中搜索已安装模块的目录 基于URL的目录结构。
例如,如果/ opt / MyApp / lib / imports在路径中,那么QML即 导入com.mycompany.Feature将导致QQmlEngine查看
/ opt / MyApp / lib / imports / com / mycompany / Feature / for components
由该模块提供。定义
需要qmldir文件 类型版本映射和可能的QML扩展插件。
默认情况下,列表包含应用程序的目录
可执行文件,QML2_IMPORT_PATH环境中指定的路径
变量,以及来自QLibraryInfo的内置Qml2ImportsPath。
在运行时删除importPathList中的Qml2ImportsPath之后,我再次发现app没有显示任何GUI的错误。
addImportPath
的文件告诉我它可以接受qrc网址。所以我添加qml中的所有文件就像上面描述的问题一样。但我仍然看不到任何GUI。
Add Existing Directory...
添加文件并将过滤器设置为*,它仍然不能包含qmldir文件。所以我通过xml代码将它添加到qrc文件中。
当我想这次必须奏效时,它什么都没有给我。就在我要放弃的时候,想出了一个想法:它不会浪费我更多的时间来检查qrc:/import/qtquick/
是否有效。
结果是false
,我的qrc使用中一定有错误。我更改前缀并使用Qt Creator保存qrc。我发现qrc文件不能使用像D:/Qt/Qt-5.5-static/qml/Qt/labs/folderlistmodel/plugins.qmltypes
这样的路径,它被Qt Creator更改为Qt/labs/folderlistmodel/plugins.qmltypes
。在这个时候,一切都很完美!
感谢您阅读我的故事。以下是解决此问题的步骤的结论:
.lib
文件和之外的所有文件的相对路径
.prl
个文件。.qrc
文件并将其包含在.pro
文件中。将所有文件包含在此.qrc
文件中。我写了一个小程序来生成xml。addImportPath
的{{1}}方法添加导入路径。