![]() |
|
![]() ![]() ![]() |
|
baggins |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 22.11.2008 Репутация: нет Всего: нет |
В программе есть предварительный просмотр изображений, хранящихся в БД, организованный через QListWidget. Выгруженные из базы изображения просто выставляются как иконки. Но при большом количестве изображений большого размера, очень быстро и сильно растет размер оперативы. Есть ли в QT средства для уменьшения размера избражений? например уменьшить dpi или еще как-нибудь? Вот код для общего представления
|
|||
|
||||
GRONN |
|
|||
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 8.3.2007 Репутация: нет Всего: нет |
В аналогичной программе просто создавал второй поток, который просыпается по мере прокрутки и подгружает из БД изображения, которые попадают в область видимости. Получается довольно быстро.
Добавлено через 1 минуту и 10 секунд P.S. Еще периодически чистить QPixmapCache, установив на него ограничение, мне кажется, будет полезно. |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Храни эскизы изображений в таблице и подгружай оттуда. Также посмотри класс QPixmapCache, может пригодится.
И посмотри флаг Qt::ImageConversionFlags у loadFromData. А вообще в example'ах очень много примеров по работе с картинками. Смотри как там сделано. |
|||
|
||||
baggins |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 22.11.2008 Репутация: нет Всего: нет |
А можно поподробнее о потоке и области видимости?
![]() |
|||
|
||||
GRONN |
|
|||
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 8.3.2007 Репутация: нет Всего: нет |
Согласен с SABROG - загружать надо именно эскизы, так и делаю.
Прошу прощения, я сначала неправильно прочел вопрос и ответ мой (про потоки) скорее объясняет как я ускорял работу, а не уменьшал оперативу. Как можно использовать QPixmapCache. Если у тебя сверхкрупные превьюхи, то идея в том, что тебе абсолютно незачем хранить то, что не попадает в область видимости виджета, и по возможности удалять из оперативки. Если ты используешь именно QListWidget, то не вижу, честно говоря, как это реализовать. А вот если ты унаследуешь QListWidget и немного модифицируешь, то сможешь сделать так: QPixmapCache поможет тебе хранить только недавно использованные картинки, установи его лимит памяти какой тебе надо. А при прокрутке, т.е. обновлении области видимости, (скажем, в функции paintEvent(), которую нужно переопределить), тебе нужно: 1. Проверить, есть ли нужная тебе картинка в QPixmapCache. 2. Если есть взять оттуда и отрисовать. 3. Если нет, то придется сообщить потоку загрузки из БД, что надо подгрузить такую-то картинку, после чего поток ее вернет твоему виджету, а тот заново себя перерисует, обнаружив при этом, что теперь нужная картинка есть в кэше. Это общая схема. Тут есть несоклько тонкостей, например как организовывать загрузку из БД, как организовывать взаимодействие потоков и тому подобное. Но они все всплывут уже по мере решения задачи - это позже. P.S. Взаимодействие с потоком, который выполняет длительную операцию (работа с графикой, сохранение файла, базы данных), очень хорошо описано в книге Бланшет и Саммерфилда по Qt 4 в главе 18 "Взаимодействие с главным потоком" |
|||
|
||||
baggins |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 22.11.2008 Репутация: нет Всего: нет |
общая схема пока ясна, буду думать всем пасип!
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |