据我所知,qml文件可以从本地目录路径加载,也可以捆绑在qrc文件中并加载qrc:/ URI。在调试阶段,更改本地qml文件不需要重新编译qrc文件并与主可执行文件链接在一起,这是尝试和错误微调的快速过程。但是在部署阶段,qml文件应该作为qrc文件捆绑在一起并链接到主C ++ Qt应用程序。当您想要单个可执行文件时,这是一个很好的做法,但是编译qrc文件并再次链接它对于大型项目来说非常耗时。有什么办法可以切换到qrc或本地目录吗?例如在调试和发布模式下?
项目中有许多qml组件,所有这些组件都是由另一个qml文件中的qrc:/componenentname.qml之类的URI创建的。
那么有没有办法在调试和发布模式下交换这两种状态,并保持qml文件没有重复更改?
答案 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")
加载,并且将从任一搜索路径加载。