如何为qtquick插件添加qrc导入路径?

时间:2015-08-07 12:04:37

标签: qt static qml qtquick2

我已经构建了一个静态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文件的一部分

enter image description here

我的演绎中有什么不对吗?

进一步研究:

我已添加 engine.addImportPath(QDir::currentPath() + QDir::separator() + "custom");

并将所有文件夹移到custom个文件夹中,它可以成功运行。并且没有此行的exe无法与custom文件夹一起运行。所以我想知道“搜索”行为不能应用于qrc文件?

1 个答案:

答案 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。

经过几天的思考。我发现我发布的图片没有qmldir文件!那是Qt Creator的一个bug。我使用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。在这个时候,一切都很完美!

感谢您阅读我的故事。以下是解决此问题的步骤的结论:

  1. 将QT_INSTALLED_PREFIX / qml中的所有文件夹复制到项目文件夹中,最好将它们放在父文件夹而不是根文件夹下。
  2. 编写一些代码以获取除.lib文件和之外的所有文件的相对路径 .prl个文件。
  3. 创建一个新的.qrc文件并将其包含在.pro文件中。将所有文件包含在此.qrc文件中。我写了一个小程序来生成xml。
  4. 使用addImportPath的{​​{1}}方法添加导入路径。
  5. 建立和享受。