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

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


Студент
*

Группа: Участник
Сообщений: 93
Регистрация: 21.10.2009
Из: Нижний Новгород
Пользователь №: 1168

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




Репутация:   0  


Я такую фишку видел у Макса Шлее или у Жасмина Бланшета. И пример такой программы тоже.
Апликация 2 Кб, а картинки раздельно . сейчас найду и притащу пример.

Вот этот пример программы. В корне лежит картинка img.jpg но ее можно и по ссылке открыть .

/* ======================================================================
**  main.cpp
** ======================================================================
**
** ======================================================================
**  Copyright (c) 2007 by Max Schlee
** ======================================================================
*/

#include <QtGui>

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    QLabel lbl("<H1><CENTER>QLabel - HTML Demo</CENTER></H1>"
               "<H2><CENTER>Image</CENTER><H2>"
               "<CENTER><IMG BORDER=\"0\" SRC=\"img.jpg\"></CENTER>"
               "<H2><CENTER>List</CENTER><H2>"
               "<OL><LI>One</LI>"
               "    <LI>Two</LI>"
               "    <LI>Three</LI>"
               "</OL>"
               "<H2><CENTER>Font Style</CENTER><H2>"
               "<CENTER><FONT COLOR=RED>"
               "    <B>Bold</B>, <I>Italic</I>, <U>Underline</U>"
               "</FONT></CENTER>"
               "<H2><CENTER>Table</CENTER></H2>"
               "<CENTER> <TABLE>"
               "    <TR BGCOLOR=#ff00ff>"
               "        <TD>1,1</TD><TD>1,2</TD><TD>1,3</TD><TD>1,4</TD>"
               "    </TR>"
               "    <TR BGCOLOR=YELLOW>"
               "        <TD>2,1</TD><TD>2,2</TD><TD>2,3</TD><TD>2,4</TD>"
               "    </TR>"
               "    <TR BGCOLOR=#00f000>"
               "        <TD>3,1</TD><TD>3,2</TD><TD>3,3</TD><TD>3,4</TD>"
               "    </TR>"
               "</TABLE> </CENTER>"
              );

    lbl.show();

    return app.exec();
}


P.S. Не забываем про спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.1.2010, 1:20
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(JuryS1806 @ 29.1.2010, 3:34) *
В корне лежит картинка img.jpg но ее можно и по ссылке открыть .
Цитата(Q2W @ 29.1.2010, 3:23) *
Т.е. без сохранения самого файла ресурса на диск.
Файл ресурса надо добавлять динамически во время исполнения без сохранения его на диск.
не выйдет такой трюк, да и незачем.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JuryS1806
  опции профиля:
сообщение 29.1.2010, 7:05
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 93
Регистрация: 21.10.2009
Из: Нижний Новгород
Пользователь №: 1168

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 29.1.2010, 1:20) *
Цитата(JuryS1806 @ 29.1.2010, 3:34) *
В корне лежит картинка img.jpg но ее можно и по ссылке открыть .
Цитата(Q2W @ 29.1.2010, 3:23) *
Т.е. без сохранения самого файла ресурса на диск.
Файл ресурса надо добавлять динамически во время исполнения без сохранения его на диск.
не выйдет такой трюк, да и незачем.


Готов поспрорить. Этот код абсолютно точно берет картинку из указанного места.
Суди сам:

размер исполняемого файла: 9,3 кб
размер картинки: 21,8 кб

Заменяю картинку другой и он показывает ее, без перекомпиляции.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.1.2010, 8:25
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(JuryS1806 @ 29.1.2010, 10:05) *
Этот код абсолютно точно берет картинку из указанного места.
места чего, области памяти?
Ты не внимательно читаешь задачу, поэтому я её процитировал
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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, 16:19) *
Можно попробовать метод bool QResource::registerResource
этот метод регистрирует ресурс находящийся на жёстком диске.

Был бы метод, который загружает ресурс из QIODevice, а не из абстракции QString, тогда ресурс можно было бы грузить в буфер
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 29.1.2010, 18:57
Сообщение #8


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

Группа: Участник
Сообщений: 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
Сообщение #9


Новичок


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

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




Репутация:   0  


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

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

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


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




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