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

如何为qtquick插件添加qrc导入路径?,qt,static,qml,qtquick2,Qt,Static,Qml,Qtquick2,我已经建立了一个静态Qt库,并希望使用它部署我的应用程序与一个独立的exe。经过一天的努力,我知道qtquick插件不能静态包含到exe中 我需要将qml文件夹中的一些文件夹复制到我的exe目录,以便exe可以显示GUI 所以我想知道我的exe需要哪个文件,我一个接一个地删除了这些文件夹中的文件,以使它为人所知。真正需要的文件只是一个plugins.QMLTYPES文件和一个qmldir文件 然后我发现QQmlApplicationEngine的导入路径可以更改,我输出了QQmlApplicat

我已经建立了一个静态Qt库,并希望使用它部署我的应用程序与一个独立的exe。经过一天的努力,我知道qtquick插件不能静态包含到exe中

我需要将
qml
文件夹中的一些文件夹复制到我的exe目录,以便exe可以显示GUI

所以我想知道我的exe需要哪个文件,我一个接一个地删除了这些文件夹中的文件,以使它为人所知。真正需要的文件只是一个
plugins.QMLTYPES
文件和一个
qmldir
文件

然后我发现
QQmlApplicationEngine
的导入路径可以更改,我输出了
QQmlApplicationEngine.importPath()
,其中一个路径就是Qt安装路径中的
qml
文件夹所以我认为这是Qt获取
plugins.QMLTYPES
文件和
qmldir
文件的搜索路径的地方。

如果我的想法是正确的,我可以将我需要的文件夹复制到
qrc
文件中,然后使用
qqqmlaplicationengine.addImportPath(“qrc:/foldersIwant”)
让exe可以在运行时导入它需要的内容。因为
qrc
被编译成exe,我可以去掉那些文件夹,让我的exe独立运行

但在我的代码中执行此操作后,应用程序仍然找不到它所需的文件,即使是
qqqmlapplicationengine.importPath()
的输出也有我输入的路径,我还根据检查了我的路径

代码如下:

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();
}
intmain(intargc,char*argv[])
{
QApplication应用程序(argc、argv);
qqmlaplicationengine;
engine.addImportPath(QStringLiteral(“qrc:/import/qtquick/”);

qDebug()最后,我得到了答案。结果表明我所有的想法都是正确的

下面是我试过的,你只需阅读结尾就可以得到清晰的步骤

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

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

在qml2中,exe可以以同样的方式编译。但是如果我在没有Qt运行时的情况下运行它,它只是在Windows操作系统上没有显示任何窗口(在其他操作系统中也没有显示任何窗口)。我在谷歌上搜索了这么多信息,发现这个问题自Qt5.0以来困扰了很多人。现在是Qt5.5,他们还没有修复。所以我需要将
QT\u INSTALLED\u PREFIX/qml
中的文件夹复制到我的应用程序的根目录,让我的应用程序显示GUI。

虽然问题将在Qt5.6()中解决,但我不能等待太久(Qt5.6将在今年年底发布),所以我决定自己打包这些文件

我碰巧看到了这个问题:。它告诉我qmldir文件可以包含在qrc文件中,Qml引擎可以搜索这些目录。所以我认为Qml文件也可以包含在qrc文件中

但首先要找到qml2的导入位置,当我查看QQmlApplicationEngine的文档时,我找到了
addImportPath
函数,我告诉自己这一定是找到导入路径的关键。文档告诉了我一切:

QStringList QQmlEngine::importPath()
const返回
引擎在目录中搜索已安装模块的目录
基于URL的目录结构。

例如,如果/opt/MyApp/lib/imports在路径中,那么QML应该
导入com.mycompany.Feature将导致QQmlEngine查看
/组件的opt/MyApp/lib/imports/com/mycompany/Feature/
由该模块提供。定义
键入版本映射和可能的QML扩展插件。

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

在运行时删除ImportMathlist中的Qml2ImportsPath之后,我重复了应用程序不显示任何GUI的错误

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

经过几天的思考。我发现我发布的图片没有qmldir文件!这是Qt Creator的一个错误。我使用
addexistingdirectory…
添加文件,并将过滤器设置为*,它仍然不能包含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
是时候了,一切都很完美

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

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