2016-03-07 4 views
2

У меня есть несколько тем папки каждый из которых содержит .qrc файл:Переключение между несколькими файлами .qrc во время выполнения

redTheme/ 
      - File.qml 
      - qml.qrc 
blueTheme/ 
      - File.qml 
      - qml.qrc 

я в настоящее время может переключаться между этими темами во время компиляции. Это означает, что мне нужно изменить свой оператор import на тему, которую я хочу использовать.

Я хотел бы знать, могу ли я сделать это во время выполнения. Это даст пользователю большую гибкость. пользователь нажимает на Button, который инициирует signal и загружает другую тему (от C++ или QML)

Моего первого допроса: Пример: я должен использовать .qrc файлы или QML Modules?

Бывший загружает свое содержимое после вызова от C++, тогда как последнее заставляет меня использовать import заявления.

Это приносит мне на другие вопросы:

  1. Могу ли я использовать несколько .qrc файлов?
  2. Если да, могу ли я «разгрузить» файл .qrc? Может быть, это глупый вопрос: Я не полностью осведомлен о механизмах системы Qt Resource System.
  3. Как загрузить еще один файл .qrc? Я бы получил файл main.qrc , загружающий просмотры и мои themes.qrc файлы, загружающие пользовательские QML объектов.

ответ

3

Да, можно, но только с помощью внешних двоичных файлов ресурсов:

qrc -файлы могут быть либо компилируются в исполняемый файл или как .rcc -файла. Эти rcc-файлы могут быть динамически загружены. См. External Binary Resources. Эти двоичные ресурсы могут быть загружены с использованием QResource::registerResource и QResource::unregisterResource.

Пример:

//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 -файла и загрузить его в зависимости от выбора пользователя.

Примечание. Фактически вы можете иметь «тему по умолчанию», скомпилированную непосредственно в приложении. Как только вы загрузите файл rcc, он будет перезаписывать все файлы с одинаковыми именами. Пока все ресурсы выглядят одинаково (одна и та же файловая структура), это будет работать нормально. И как только вы разгрузите rcc, Qt вернется к ресурсам приложений.

+0

Я немного скептически отношусь к этой работе. Во-первых, вы не упомянули, как QML перезагружается движком QML. Во-вторых, как приложение может загрузить другое изображение при регистрации нового ресурса? Вы пробовали это, скажем, с помощью простого приложения QML, которое отображает «изображение»? Обновляется ли изображение при загрузке нового файла .rcc? – Mitch

+0

Я создал ваш пример и сгенерировал свой файл 'redTheme.rcc'. Я поместил его в исполняемый каталог. Однако, когда я использую 'QResource :: registerResource (" redTheme.rcc ");', он возвращает 'false'. Зачем? Может быть, из-за моего компилятора ([см. Этот вопрос] (http: // stackoverflow.ком/вопросы/29073163/кварта-5-4-неспособная к доступу-ресурсы из-коды)) ?. Я также использую MSVC 2013. –

+1

@ Запустите свое право, которое не будет обновляться - переключение ресурсов ничего не обновит, это делается вручную, например, при перезапуске приложения. – Felix

Смежные вопросы