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元素,而不必重新启动应用程序。如果它有效,我将提交对你答案的编辑。