QResource: отменить регистрацию файлов.rcc

У нас есть приложение с несколькими темами, которое вызывает другие второстепенные приложения. Итак, в основном приложении есть что-то вроде этого:

// User opens app with theme A
QResource::registerResource("theme_a.rcc");      // returns TRUE

// User changes theme to B
QResource::unregisterResource("theme_a.rcc");    // returns TRUE
QResource::registerResource("theme_b.rcc");      // returns TRUE

Все отлично работает на основном приложении. Проблема начинается, когда это программное обеспечение вызывает другие приложения QT.

Внутри этих второстепенных приложений мы следуем одному и тому же потоку регистрации и отмены регистрации. Странная часть в том, что регистр всегда работает, а незарегистрированный никогда не работает (только внутри небольших приложений). Это происходит примерно так:

// User opens app with theme A
QResource::registerResource("minor_theme_a.rcc");      // returns TRUE

// User changes theme to B
QResource::unregisterResource("minor_theme_a.rcc");    // returns FALSE
QResource::registerResource("minor_theme_b.rcc");      // returns TRUE

Почему это происходит? Есть ли решение?

2 ответа

Решение

unregisterResource возвращает истину, если ресурс успешно выгружен и ссылки на ресурс отсутствуют.

Так что в вашем случае может быть еще несколько ссылок из некоторых других форм.

Важная документация в отношении unregisterResource:

Если есть QResources, которые в настоящее время ссылаются на ресурсы, связанные с незарегистрированным файлом, они будут продолжать действовать, но сам файл ресурса будет удален из корней ресурсов, и, таким образом, дальнейший QResource не может быть создан, указывая на эти данные ресурса. Сам ресурс будет удален из памяти, когда будет уничтожен последний QResource.

Так что мое сильное предположение QResource все еще указывает на тот, который вы пытались отменить.

Причина в том, что ресурсы, которые вы хотите отменить, все еще указаны QResource, приведенный ниже код помогает мне успешно отменить регистрацию:

      QQmlEngine::clearComponentCache();
QResource::unregisterResource(xxx/xxx.rcc);
Другие вопросы по тегам