关于qt:在qrc和qml文件的本地路径之间切换

Switching between qrc and local path for qml files

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

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

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


QML中的所有URL(如果未完整指定)均相对于当前文件。

例如如果QML文件包含这样的内容

1
2
3
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文件时在资源文件和本地文件之间切换。

1
2
3
4
QUrl mainFile = localMode ? QUrl::fromLocalFile("main.qml") : QUrl("qrc://main.qml")

QQuickView view;
view.setSource(mainFile);


很抱歉,以前的帖子,

我们要做的是使用Qts资源搜索路径。我们使用了PySide2,因此示例在python

1
2
3
4
5
6
7
8
9
10
11
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")加载资源,并且将从任一搜索路径加载资源。