【问题标题】:How can I add the qrc import path for qtquick plugin?如何为 qtquick 插件添加 qrc 导入路径?
【发布时间】:2015-10-30 20:58:14
【问题描述】:

我已经构建了一个静态 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() 的输出具有我放入的路径,应用程序仍然找不到它需要的文件,并且我还根据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 文件?

【问题讨论】:

    标签: qt static qml qtquick2


    【解决方案1】:

    终于,我得到了答案。结果表明我所有的想法都是正确

    以下是我尝试过的,您可以阅读末尾以获得清晰的步骤。

    我的目标是编译一个独立的 qml2 应用程序 exe。

    在 qml1 中,我可以构建静态 Qt 库并用它编译我的应用程序。

    在qml2中,可以用同样的方式编译exe。但是如果我在没有 Qt-Runtime 的情况下运行它。它只是在 Windows 操作系统上没有显示任何窗口(在其他操作系统中也没有显示任何内容)。 google了很多资料,发现这个问题从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/ 用于组件
    由该模块提供。定义
    需要一个 qmldir 文件 类型版本映射和可能的 QML 扩展插件。

    默认情况下,列表包含应用程序的目录
    可执行文件,在 QML2_IMPORT_PATH 环境中指定的路径
    变量,以及来自 QLibraryInfo 的内置 Qml2ImportsPath。

    我在运行时删除了 importPathList 中的 Qml2ImportsPath 后,再次出现应用不显示任何 GUI 的错误。

    addImportPath的文件告诉我它可以接受qrc url。所以我在 qml 中添加所有文件,就像上面描述的问题一样。但我仍然看不到任何 GUI。

    经过几天的思考。我发现我发布的有问题的图片没有 qmldir 文件!这是 Qt Creator 的一个错误。我使用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. 使用QQmlApplicationEngineaddImportPath方法添加导入路径。
    5. 构建并享受。

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 2010-10-16
      • 2012-10-16
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 2015-11-20
      相关资源
      最近更新 更多