Qt 在运行时在多个.qrc文件之间切换
我有几个主题文件夹,每个文件夹包含一个Qt 在运行时在多个.qrc文件之间切换,qt,qml,Qt,Qml,我有几个主题文件夹,每个文件夹包含一个.qrc文件: redTheme/ - File.qml - qml.qrc blueTheme/ - File.qml - qml.qrc 我目前能够在编译时在这些主题之间切换。这意味着我需要将我的import语句更改为我想要使用的主题 我想知道我是否可以在运行时这样做。它将为用户提供更大的灵活性。示例:用户单击一个按钮,该按钮触发一个信号,并加载另一个主题(从C++
.qrc
文件:
redTheme/
- File.qml
- qml.qrc
blueTheme/
- File.qml
- qml.qrc
我目前能够在编译时在这些主题之间切换。这意味着我需要将我的import
语句更改为我想要使用的主题
我想知道我是否可以在运行时这样做。它将为用户提供更大的灵活性。示例:用户单击一个按钮
,该按钮触发一个信号
,并加载另一个主题(从C++
或QML
)
我的第一个问题是:我应该使用.qrc
文件还是
前者在从C++
调用后加载其内容,而后者迫使我使用import
语句
这就引出了其他问题:
.qrc
文件吗.qrc
文件吗?可能是个愚蠢的问题
我不完全了解Qt资源系统机制.qrc
文件?我将拥有我的main.qrc
文件
加载视图和我的主题.qrc
文件加载自定义QML
对象可以,但只能使用外部资源二进制文件:
qrc
-文件可以编译为可执行文件,也可以编译为.rcc
-文件。这些rcc文件可以动态加载。看见可以使用和加载这些二进制资源
例如:
//Build the resources using:
rcc -binary redTheme/qml.qrc -o <build_dir>/themes/redTheme.rcc
rcc -binary blueTheme/qml.qrc -o <build_dir>/themes/blueTheme.rcc
//And in your code:
QResource::registerResource("./themes/redTheme.rcc");
//switching the resource:
QResource::unregisterResource("./themes/redTheme.rcc");
QResource::registerResource("./themes/blueTheme.rcc");
//使用以下内容构建资源:
rcc-binary-redTheme/qml.qrc-o/themes/redTheme.rcc
rcc-binary-blueTheme/qml.qrc-o/themes/blueTheme.rcc
//在您的代码中:
注册资源(“./themes/redTheme.rcc”);
//切换资源:
QResource::unregisteresource(“./themes/redTheme.rcc”);
注册资源(“./themes/blueTheme.rcc”);
使用此机制,您可以将每个主题打包到rcc
-文件中,并根据用户的选择进行加载
注意:您实际上可以将“默认主题”直接编译到应用程序中。一旦加载
rcc
-文件,它将覆盖所有同名文件。只要所有资源看起来都一样(相同的文件结构),就可以正常工作。一旦卸载rcc
,Qt将切换回应用程序资源。我对这一工作方式有点怀疑。首先,您没有提到QML引擎是如何重新加载QML的。其次,当注册新资源时,应用程序如何知道加载不同的映像?您是否尝试过,比如说,一个显示图像的简单QML应用程序?在加载新的.rcc文件时,图像是否得到更新?我已经设置了您的示例并生成了我的redTheme.rcc
文件。我已经把它放在可执行目录中了。但是,当我使用QResource::registerResource(“redTheme.rcc”)
,它返回false
。为什么?可能是因为我的编译器()?。我也在使用MSVC 2013。@米奇你的权利,这不会更新-切换资源不会更新任何内容,这是手动完成的,例如通过重新启动应用程序。@Grégoirebrebrerel-它适用于我的MSVC 2013-你是舒尔的路径正确吗?首先尝试调用File::exists(“redTheme.rcc”)
查看是否存在。好的,找到了我的文件(我已经创建了一个关于此问题的解决方案)。然而,正如你们所预料的,它不会更新。我将尝试找到一种方法来更新我的QML元素,而不必重新启动应用程序。如果它有效,我将提交对你答案的编辑。