gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:12:58 59 4
gpt4 key购买 nike

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

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

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

然后我发现 QQmlApplicationEngine 的导入路径可以改变,我输出 QQmlApplicationEngine.importPathList() 并且路径之一就是 qml Qt 安装路径中的文件夹。 所以我认为这是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文件的一部分

enter image description here

我的演绎有什么问题吗?

进一步研究:

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

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

最佳答案

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

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

我的目标是编译一个独立的 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 Returns the list of
directories where the engine searches for installed modules in a
URL-based directory structure.

For example, if /opt/MyApp/lib/imports is in the path, then QML that
imports com.mycompany.Feature will cause the QQmlEngine to look in
/opt/MyApp/lib/imports/com/mycompany/Feature/ for the components
provided by that module. A qmldir file is required for defining the
type version mapping and possibly QML extensions plugins.

By default, the list contains the directory of the application
executable, paths specified in the QML2_IMPORT_PATH environment
variable, and the builtin Qml2ImportsPath from QLibraryInfo.

我在运行时删除importPathList中的Qml2ImportsPath后,重现了app不显示任何GUI的bug。

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. 构建并享受。

关于qt - 如何为 qtquick 插件添加 qrc 导入路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31877311/

59 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com