crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Добавление произвольного ресурса в 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);". Т.е. без сохранения самого файла ресурса на диск.
Файл ресурса надо добавлять динамически во время исполнения без сохранения его на диск.

Нашёл только как делать ресурсы при компиляции и добавлять директорию для поиска ресурсов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
SABROG
  опции профиля:
сообщение 29.1.2010, 18:57
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(Litkevich Yuriy @ 29.1.2010, 15:01) *
этот метод регистрирует ресурс находящийся на жёстком диске.


Там их несколько. Чтобы можно было зарегистрировать ресурс прямо из памяти нужно, чтобы содержимое этой памяти было в определенном формате. Если воспользоваться командой:

rcc -binary myresource.qrc -o myresource.rcc


То компилятор ресурсов создаст бинарный файл .rcc. Я поместил этот бинарный файл в ресурсы и оттуда читаю в QByteArray через QFile (физически всё в памяти):

        QByteArray ba = file.readAll();

        const uchar* rcc = reinterpret_cast<const uchar*>(ba.constData());
        if (!QResource::registerResource(rcc)) {
            qDebug() << "Can't register resource.";
        }

        QDirIterator i(":/", QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot | QDir::NoSymLinks);
            while (i.hasNext()) {
                i.next();
                qDebug() << i.fileName();
            }


И видим, что в корне ресурсов появились новые файлы. Хочу вас предупредить насчет функции 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
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 6.8.2009
Пользователь №: 988

Спасибо сказали: 0 раз(а)




Репутация:   0  


Жуть, как всё сложно.
Для моей задачи слишком дорогое решение в плане реализации.

Но, тем не менее, спасибо на том.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 13:35