Добавление произвольного ресурса в run time, из массива байтов без сохранения их на диск |
Здравствуйте, гость ( Вход | Регистрация )
Добавление произвольного ресурса в run time, из массива байтов без сохранения их на диск |
Q2W |
29.1.2010, 0:23
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 3 Регистрация: 6.8.2009 Пользователь №: 988 Спасибо сказали: 0 раз(а) Репутация: 0 |
Есть файл ресурса (например, картинка) в виде массива байтов.
Нужно сделать так, чтобы она была доступна в QSS приверно так: "background-image: url(:/backgrounds/new-bg-1.png);". Т.е. без сохранения самого файла ресурса на диск. Файл ресурса надо добавлять динамически во время исполнения без сохранения его на диск. Нашёл только как делать ресурсы при компиляции и добавлять директорию для поиска ресурсов. |
|
|
JuryS1806 |
29.1.2010, 0:34
Сообщение
#2
|
Студент Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: 0 |
Я такую фишку видел у Макса Шлее или у Жасмина Бланшета. И пример такой программы тоже.
Апликация 2 Кб, а картинки раздельно . сейчас найду и притащу пример. Вот этот пример программы. В корне лежит картинка img.jpg но ее можно и по ссылке открыть .
P.S. Не забываем про спасибо. |
|
|
Litkevich Yuriy |
29.1.2010, 1:20
Сообщение
#3
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
В корне лежит картинка img.jpg но ее можно и по ссылке открыть . Т.е. без сохранения самого файла ресурса на диск. не выйдет такой трюк, да и незачем.
Файл ресурса надо добавлять динамически во время исполнения без сохранения его на диск. |
|
|
JuryS1806 |
29.1.2010, 7:05
Сообщение
#4
|
Студент Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: 0 |
В корне лежит картинка img.jpg но ее можно и по ссылке открыть . Т.е. без сохранения самого файла ресурса на диск. не выйдет такой трюк, да и незачем.Файл ресурса надо добавлять динамически во время исполнения без сохранения его на диск. Готов поспрорить. Этот код абсолютно точно берет картинку из указанного места. Суди сам: размер исполняемого файла: 9,3 кб размер картинки: 21,8 кб Заменяю картинку другой и он показывает ее, без перекомпиляции. |
|
|
Litkevich Yuriy |
29.1.2010, 8:25
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
SABROG |
29.1.2010, 13:19
Сообщение
#6
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Можно попробовать метод bool QResource::registerResource ( const uchar * rccData, const QString & mapRoot = QString() ) [static] (как вам уже написали на prog.org'e), и еще один вариант унаследоваться от QAbstractFileEngine. Подробней можно почитать здесь.
|
|
|
Litkevich Yuriy |
29.1.2010, 15:01
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
SABROG |
29.1.2010, 18:57
Сообщение
#8
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
этот метод регистрирует ресурс находящийся на жёстком диске. Там их несколько. Чтобы можно было зарегистрировать ресурс прямо из памяти нужно, чтобы содержимое этой памяти было в определенном формате. Если воспользоваться командой:
То компилятор ресурсов создаст бинарный файл .rcc. Я поместил этот бинарный файл в ресурсы и оттуда читаю в QByteArray через QFile (физически всё в памяти):
И видим, что в корне ресурсов появились новые файлы. Хочу вас предупредить насчет функции registerResource(). Если ей передать указатель, который возвращает QByteArray::data(), то по неизвестным мне причинам вызывается функция с параметрами QString, а не const uchar*. И метод тупо возвращает false. Мне пришлось лезть в отладчик, чтобы понять почему она не работает. В итоге все свелось к приведению типов. Как бы не критиковали reinterpret_cast у меня небыло другого выбора, т.к. static_cast не умеет преобразовывать unsigned к signed типу и обратно. Я бы конечно мог воспользоваться такой конструкцией static_cast<const uchar*>(static_cast<void*>(ba.data())) или Си преобразованием, но первое выглядит ужасно, а второе соответственно тоже плохо. Но автор не сможет в рантайме сгенерить бинарный блок определенного формата, это делает только rcc. Значит остается только один вариант: QAbstractFileEngine Сообщение отредактировал SABROG - 29.1.2010, 21:05 |
|
|
Q2W |
30.1.2010, 0:14
Сообщение
#9
|
Новичок Группа: Новичок Сообщений: 3 Регистрация: 6.8.2009 Пользователь №: 988 Спасибо сказали: 0 раз(а) Репутация: 0 |
Жуть, как всё сложно.
Для моей задачи слишком дорогое решение в плане реализации. Но, тем не менее, спасибо на том. |
|
|
Текстовая версия | Сейчас: 29.11.2024, 8:52 |