在qrc和qml文件的本地路径之间切换

时间:2016-12-25 07:07:39

标签: qt qml

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

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

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

2 个答案:

答案 0 :(得分:7)

QML中的所有网址,如果未全部指定,则相对于当前文件。

E.g。如果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);

答案 1 :(得分:0)

很抱歉以前的帖子,

我们要做的是使用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")加载,并且将从任一搜索路径加载。