Удаление / изменение статических ресурсов Qt во время выполнения
Как часть взлома Qt Designer, я заинтересован в удалении ресурса во время выполнения (особенно :/trolltech/widgetbox/widgetbox.xml
). Обратитесь к концу поста для более подробной информации о контексте.
Моя очевидная (и неудачная) попытка была:
QFile(":/trolltech/widgetbox/widgetbox.xml").remove();
но он вернул ошибку.
Моя следующая попытка была использовать Q_CLEANUP_RESOURCE(widgetbox)
, но функции, к которым он расширяется, доступны только в частном компоненте Qt Designer (QDesignerComponents).
Еще одна попытка была очистить содержимое файла, но это только для чтения:
QFile f(":/trolltech/widgetbox/widgetbox.xml");
if (f.open(QFile::WriteOnly)) { ... } // returns false
Я также попытался перезаписать его в файловой системе ресурса Qt, определив свой собственный :/trolltech/widgetbox/widgetbox.xml
, Я могу открыть файл, но он не может получить данные, я думаю, потому что это дубликат ресурса (присвоение ресурса неиспользуемому имени заставляет приложение правильно распечатывать содержимое). С другой стороны, список виджетов представлен правильно.
QFile f(":/trolltech/widgetbox/widgetbox.xml");
if (f.open(QFile::ReadOnly)) {
qDebug() << "{";
qDebug() << f.readAll(); // shows nothing
qDebug() << "}";
}
Есть ли способ изменить / удалить / заменить файл ресурсов во время выполнения?
В случае, если вы считаете, что это проблема XY, я объясню весь контекст: я интегрирую Qt Designer в свою собственную среду разработки, внося небольшие изменения в автономную. По сути, я добавил флаг компиляции, чтобы генерировать динамическую библиотеку вместо исполняемого файла, и добавил некоторые опции, чтобы открыть главное окно.
В этой IDE я хочу добавить опцию, чтобы пользователь не использовал стандартные виджеты и ограничивал список набором пользовательских. Упомянутый мною ресурс - это файл, содержащий список виджетов, доступных в Qt Designer по умолчанию. Дополнительные виджеты могут быть легко включены через плагины, но я не нашел способа удалить стандартные.
Один из вариантов, который у меня есть, - сделать эту загрузку необязательной, но она приведет к каскаду изменений во многих проектах. Я бы не хотел так сильно изменять Qt Designer.
1 ответ
Вы уже используете Qt Designer, поэтому, во-первых, вы должны включить его в свою сборку, а во-вторых, у вас будет доступ ко всем его классам - больше нет такого понятия, как "закрытый" компонент, теперь это ваш код. Заставь это работать на тебя!
Ресурсы Qt могут быть скомпилированы или сгенерированы в отдельном двоичном файле. Вы можете поместить этот ресурс в отдельный двоичный файл, а затем легко загружать и выгружать его через registerResource
/ unregisterResource
,
QFile
использует виртуальную файловую систему на основе QAbstractFileEngine
, Реализация QAbstractFileEngineHandler::create
действует как фильтр и может перехватить запрос и позволить вашему файловому движку обработать его при желании. Например, ваш файловый движок может просто перестать работать при открытии - это равносильно удалению ресурса.
Обратите внимание, что начиная с Qt 5 QAbstractFileEngine
больше не является публичным и, вероятно, люди Qt пытаются заменить его чем-то другим. Чтобы использовать эти API, вам нужно добавить qt += core-private
в файл qmake вашего проекта.