【问题标题】:Switching between qrc and local path for qml files在 qml 文件的 qrc 和本地路径之间切换
【发布时间】:2017-05-10 05:06:42
【问题描述】:

据我所知,qml 文件可以从本地目录路径加载,也可以捆绑在 qrc 文件中并使用 qrc:/ URI 加载。在调试阶段更改本地 qml 文件不需要重新编译 qrc 文件并与主可执行文件链接在一起,这是尝试和错误微调的快速过程。但在部署阶段,qml 文件应该捆绑在一起作为 qrc 文件并链接到主 C++ Qt 应用程序。当您想要单个可执行文件时,这是一个很好的做法,但是编译 qrc 文件并再次链接它对于大型项目来说非常耗时。有什么办法可以切换到 qrc 或本地目录?例如在调试和发布模式下?

项目中有很多 qml 组件,所有这些都是由 URI 像 qrc:/componenentname.qml 在另一个 qml 文件中创建的。

那么有什么办法可以在调试和发布模式下互换这两种状态,并保持 qml 文件不重复更改?

【问题讨论】:

    标签: qt qml


    【解决方案1】:

    QML 中的所有 URL,如果没有完整指定,都是相对于当前文件的。

    例如如果 QML 文件有这样的内容

    Image {
        source: "images/foo.png"
    }
    

    然后在运行时根据 QML 文件本身的基本 URL 构建图像的完整 URL。

    即如果 QML 文件本身是 qrc://main.qml,那么生成的路径是 qrc://images/foo.png,如果 QML 文件本身是 file:///path/to/your/project/main.qml,那么生成的图像源是 file:///path/to/your/project/image/foo.png。

    因此,如果您在 QML 中的使用中保持 URL 的相关性,您可以在加载主 QML 文件时简单地在资源文件和本地文件之间切换。

    QUrl mainFile = localMode ? QUrl::fromLocalFile("main.qml") : QUrl("qrc://main.qml")
    
    QQuickView view;
    view.setSource(mainFile);
    

    【讨论】:

      【解决方案2】:

      对不起,旧帖子,

      我们所做的就是使用 Qts 资源搜索路径。我们使用了 PySide2,所以示例在 python 中

      try:
          QDir.addSearchPath('search_path_name', 'path/to/root/resources')
          engine.load('search_path_name:/main.qml')
      
      except FileNotFoundError:
          try:
              import qml # compiled resources using pyside resource compiler
              QDir.addSearchPath('search_path_name', ':/')
              engine.load('qrc:///main.qml')
          except ModuleNotFoundError:
                  pass
      

      从此时开始,资源使用QFile("search_path_name:some_file.txt") 加载,并且将从任一搜索路径加载。

      【讨论】:

        猜你喜欢
        • 2017-02-03
        • 1970-01-01
        • 1970-01-01
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        • 2013-03-24
        • 2021-11-17
        • 2014-04-27
        相关资源
        最近更新 更多