Russian Qt Forum

Qt => Общие вопросы => Тема начата: Luck от Февраль 12, 2010, 15:26



Название: Строковые ресурсы
Отправлено: Luck от Февраль 12, 2010, 15:26
Здравствуйте.
Есть ли возможность в QT создать строковый ресурс, где будет храниться набор констант типа Char или QString? Если есть, то как?
В гугл не надо отсылать - я довольно-таки долго искал и не нашел (мб, конечно, плохо искал, но я старался ;) )


Название: Re: Строковые ресурсы
Отправлено: BRE от Февраль 12, 2010, 15:29
Здравствуйте.
Есть ли возможность в QT создать строковый ресурс, где будет храниться набор констант типа Char или QString? Если есть, то как?
Что подразумевается по строковым ресурсом?
Можно текстовый файл в qrc положить и загружать его оттуда куда нибудь в QStringList или QMap<key, QString>.


Название: Re: Строковые ресурсы
Отправлено: Luck от Февраль 12, 2010, 15:48
Такая реализация не подходит (по заданию). Нужен некий аналог resourcestring из делфи. Там вместо QMap<key, QString> есть список ключей и значений. Т.е. считывать в QMap из файла нельзя. Надо чтобы данные брались прямо из ресурса.


Название: Re: Строковые ресурсы
Отправлено: BRE от Февраль 12, 2010, 15:51
Такая реализация не подходит (по заданию). Нужен некий аналог resourcestring из делфи. Там вместо QMap<key, QString> есть список ключей и значений. Т.е. считывать в QMap из файла нельзя. Надо чтобы данные брались прямо из ресурса.
Что такое ресурс? Файл? Коллекция? Кто туда данные заносит?

Можно все записать в .ini файл и брать оттуда по ключу. См: QSettings.


Название: Re: Строковые ресурсы
Отправлено: Luck от Февраль 12, 2010, 16:07
про QSettings я и сам знаю... Но от меня хотят именно строковый ресурс... Что он должен из себя представлять в QT я сам не знаю - потому и спрашиваю


Название: Re: Строковые ресурсы
Отправлено: lit-uriy от Февраль 12, 2010, 21:06
>>Но от меня хотят именно строковый ресурс
Ты расскажи, что ты под этим подразумеваешь, не зависимо от Qt. Ссылка не Дельфи мне ни о чём не говорит.


Название: Re: Строковые ресурсы
Отправлено: SABROG от Февраль 12, 2010, 21:20
про QSettings я и сам знаю... Но от меня хотят именно строковый ресурс... Что он должен из себя представлять в QT я сам не знаю - потому и спрашиваю

Твой строковый ресурс это ini файл помещенный в .qrc файл и QSettings, который читает его из ресурса ":/file.ini"

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


Название: Re: Строковые ресурсы
Отправлено: Luck от Февраль 12, 2010, 21:52
про QSettings я и сам знаю... Но от меня хотят именно строковый ресурс... Что он должен из себя представлять в QT я сам не знаю - потому и спрашиваю

Твой строковый ресурс это ini файл помещенный в .qrc файл и QSettings, который читает его из ресурса ":/file.ini"

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

Большое спасибо, мне все стало понятно :)


Название: Re: Строковые ресурсы
Отправлено: kolob от Февраль 11, 2011, 16:49
Добрый день. Тема конечно устарела, но все таки, мой вопрос похожий.

Цитировать
Можно текстовый файл в qrc положить и загружать его оттуда куда нибудь в QStringList или QMap<key, QString>.

Можно поподробнее как txt файл засунуть в ресурс Qt?

У меня есть файл txt. Он мне нужен только для чтения, чтобы выгружать из него инфу. Но нужно его как то вшить в exe.
Делал через ресурс так:
1. В *.pro записал RESOURCES = файл_ресурс.qrc
2. Файл находится в каталоге res/ , который находиться в каталоге проекта.
3. Файл_ресурс.qrc
Код:
<!DOCTYPE RCC><RCC version='1.0'>
<qresource>
<file>res/файл_ресурс.txt</file>
</qresource>
</RCC>
4. В программе пишу QFile fille(":res/файл_ресурс.txt");
и т.д.

Но пока все описанное не получается.


Название: Re: Строковые ресурсы
Отправлено: kolob от Февраль 15, 2011, 21:42
сам разобрался тут (http://doc.qt.nokia.com/3.3/qembed.html)


Название: Re: Строковые ресурсы
Отправлено: richardzorgi от Май 29, 2011, 12:44
Цитировать
Можно поподробнее как txt файл засунуть в ресурс Qt?
У меня есть файл txt. Он мне нужен только для чтения, чтобы выгружать из него инфу. Но нужно его как то вшить в exe.
Делал так: файл->новый файл->файл ресурсов Qt->имя - resource, путь по умолчанию(resource.qrc создаётся там же, где лежит файл .pro )->добавить префикс - ставлю "/", добавить файл - открываю нужный файл (пусть будет 1.txt)->в своей функции(слоте) пишу QString str = ":/1.txt"; в str записывается именно ":/1.txt", а не "E:\\data\\1.txt".

Можно по подробнее, как добавить файл к проекту, чтобы он был привязан к проекту? Вообще нужно чтобы этот файл шёл в .sis (или .exe).


QT Creator, QT версии 4.7.3 (в последних версиях QEmbed убрали)


Название: Re: Строковые ресурсы
Отправлено: twp от Май 30, 2011, 12:14
все ресурсы, указанные в qrc-файле, при сборке интегрируются в запускной файл и никаких дополнительных действий не нужно.


Название: Re: Строковые ресурсы
Отправлено: richardzorgi от Май 30, 2011, 18:45
Ок, а как выполнить чтение из текстового файла, помещенного в ресурсы?


Название: Re: Строковые ресурсы
Отправлено: twp от Май 30, 2011, 19:08
сам не пробовал, но по идее так же как и файл на диске: QFile + QTextStream. Единственное что нужно открывать с флагом QIODevice::ReadOnly


Название: Re: Строковые ресурсы
Отправлено: richardzorgi от Май 30, 2011, 20:18
сам не пробовал, но по идее так же как и файл на диске: QFile + QTextStream. Единственное что нужно открывать с флагом QIODevice::ReadOnly
да, по идее так, пробовал использовать qfile, qtextstream методом тыка, с помощью документации. Пока без успешно. Там ещё вроде надо подключать <qresource>, инициализировать ресурсы... Пойду попробую ещё...


Название: Re: Строковые ресурсы
Отправлено: kambala от Май 30, 2011, 20:22
не забыл двоеточие перед путем к файлу?


Название: Re: Строковые ресурсы
Отправлено: richardzorgi от Май 30, 2011, 21:05
1) <qresource> не добавляю,
бинарный файл .rcc тоже никуда не добавляю
2)пишу
QFile f("c:\\data\\1.txt");
f.open(QIODevice::ReadOnly);
QTextStream  in(&f);
далее проверяю f.isOpen(), если открыт, то соответствующее сообщение вывожу в qDebug
если при открытии файла указывать полный путь, то все ок,  если писать f(":/1.txt"); то файл не открывается

нашел ошибку!, забыл расширение, писал f (":/1"), просто у меня длинные имена файлов, пишу с телефона.
Всем огромное Спасибо!


Название: Re: Строковые ресурсы
Отправлено: twp от Май 30, 2011, 21:12
можно глянуть содержимое файла ресурсов?


Название: Re: Строковые ресурсы
Отправлено: richardzorgi от Май 30, 2011, 21:22
можно глянуть содержимое файла ресурсов?
там все правильно, проблема решена, спасибо за помощь.


Название: Re: Строковые ресурсы
Отправлено: ритт от Май 30, 2011, 23:03
а в Вилабаджио крестьяне пишут
Код:
static const char* strings[] = {};
и не тратят по три дня на решение "проблемы"...


Название: Re: Строковые ресурсы
Отправлено: richardzorgi от Май 30, 2011, 23:59
а в Вилабаджио крестьяне пишут
Код:
static const char* strings[] = {};
и не тратят по три дня на решение "проблемы"...
А потом у них мобильные телефоны вешаются от нехватки оперативной памяти


Название: Re: Строковые ресурсы
Отправлено: ритт от Май 31, 2011, 01:10
ну да, ведь при таком подходе строки в бинарнике при загрузке маппятся в памяти, тем самым потребляя её, а вот подлинкованные ресурсы...то же самое, только плюс ещё и обёртка ресурса.
тупой аргумент, надо заметить...


Название: Re: Строковые ресурсы
Отправлено: Igors от Май 31, 2011, 08:49
Памяти тут особо не сэкономить, а вот править внешним редактором (не перекомпилируя приложение как в Вилабаджио) - ценная/нужная возможность. Заметим что в нативных ресурсах это есть (как на Mac, так и на Вындоуз, про Линукс ничего не знаю) так что может проще использовать их.


Название: Re: Строковые ресурсы
Отправлено: twp от Май 31, 2011, 10:21
однако в данный момент это не так и нужно все равно пересобирать приложение
Цитировать
Currently, Qt always stores the data directly in the executable, even on Windows and Mac OS X, where the operating system provides native support for resources. This might change in a future Qt release.


Название: Re: Строковые ресурсы
Отправлено: GreatSnake от Май 31, 2011, 10:33
однако в данный момент это не так и нужно все равно пересобирать приложение
Цитировать
Currently, Qt always stores the data directly in the executable, even on Windows and Mac OS X, where the operating system provides native support for resources. This might change in a future Qt release.
Неправда ваша. Сей коммент говорит лишь о том, что на данный момент Qt не поддерживает нативные ресурсы.
Никто не мешает грузить ресурсы динамически через QResource.


Название: Re: Строковые ресурсы
Отправлено: twp от Май 31, 2011, 11:00
за динамическую загрузку ресурса никто не говорил, кроме того все равно требуется прогнать через rcc


Название: Re: Строковые ресурсы
Отправлено: GreatSnake от Май 31, 2011, 11:18
за динамическую загрузку ресурса никто не говорил, кроме того все равно требуется прогнать через rcc
зато говорил
однако в данный момент это не так и нужно все равно пересобирать приложение
пересборка приложения и .qrc не одно и тоже)


Название: Re: Строковые ресурсы
Отправлено: twp от Май 31, 2011, 11:36
пересборка приложения и .qrc не одно и тоже)
согласен, просто одним текстовым редактором не обойтись, да и все приложение не пересобирается


Название: Re: Строковые ресурсы
Отправлено: GreatSnake от Май 31, 2011, 11:45
просто одним текстовым редактором не обойтись
Ну почему же, можно взять и написать редактор ресурсов и подарить его людям )


Название: Re: Строковые ресурсы
Отправлено: ритт от Май 31, 2011, 12:56
Igors, пересобирать ведь всё-равно придётся.

тут вопрос может стоять только в количестве релокейшенов, но для статических строковых констант это легко обходится.
ещё мб в удобстве доступа к содержимому, но кс extern ещё, вроде бы, не отменили.

так что, неубедительно...


Название: Re: Строковые ресурсы
Отправлено: Igors от Май 31, 2011, 13:56
Igors, пересобирать ведь всё-равно придётся.
Хмм... неск. раз была такая ситуация: отрелизились, начали работу над следующей версией. Месяца так через 2 указывают на мелкие ошибки в текстах сообщений и.т.п. Восстановить предыдущие исходники, перекомпилить на 2 платформах - вот тут приходится пожалеть что строки не в ресурсах.

Во всяком случае для нативных ресурсов - нет смысла их хранить в самом приложении, лучше отдельным файлом. На Mac этот файл цепляю к проекту и он помещается в bundle - для пользователя все равно 1 бубочка. На Вындоуз - файл рядом с приложением




Название: Re: Строковые ресурсы
Отправлено: richardzorgi от Июнь 26, 2011, 18:14
Не поленился, проверил, где больше будет съедаться оперативная память: в приложении, в котором текст прописан в коде, или в приложении, где тот же текст подцеплен ресурсным файлом.
Результат меня удивил: текст был порядка 200кб, оперативную память смотрел через Jbak TaskMan -> свойства задачи. В обоих случаях  показывало следующее:
Память:
 Оперативная: 4b
  Общая ... - не помню, = размер sys файла.
Но! Приложение с ресурсным файлом (sis) занимает меньше места, чем приложение с текстом в коде. - похоже при сборке ресурсные файлы по возможности сжимаются. (Приложение с ресурсным фалом весило порядка 150kb, приложение с текстом в коде больше 200kb)