Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Предварительный просмотр изображений в QListWidget 
:(
    Опции темы
baggins
Дата 14.2.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 22.11.2008

Репутация: нет
Всего: нет



В программе есть предварительный просмотр изображений, хранящихся в БД, организованный через QListWidget. Выгруженные из базы изображения просто выставляются как иконки. Но при большом количестве изображений большого размера, очень быстро и сильно растет размер оперативы. Есть ли в QT средства для уменьшения размера избражений? например уменьшить dpi  или еще как-нибудь? Вот код для общего представления

Код

void ImgWindow::LoadList()
{
    QSqlQuery query;
    QByteArray bytes;
    if(query.exec("select IDIMAGE, DATAIMAGE, PATH from TBLIMAGE"))
    {
        query.first();
        do
        {
            QString strPath = query.record().value(QLatin1String("PATH")).toString();
            QListWidgetItem *item = new QListWidgetItem(strPath, ui.listImage);
            bytes = query.record().value(QLatin1String("DATAIMAGE")).toByteArray();
            ImageDB.loadFromData(bytes);
            item->setIcon(ImageDB);

            int IDImg;
            IDImg = query.record().value(QLatin1String("IDIMAGE")).toInt();
            item->setData(32,IDImg);
        }
        while (query.next());
    }
    query.finish();
}


PM MAIL   Вверх
GRONN
Дата 14.2.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 8.3.2007

Репутация: нет
Всего: нет



В аналогичной программе просто создавал второй поток, который просыпается по мере прокрутки и подгружает из БД изображения, которые попадают в область видимости. Получается довольно быстро.

Добавлено через 1 минуту и 10 секунд
P.S. Еще периодически чистить QPixmapCache, установив на него ограничение, мне кажется, будет полезно.
PM MAIL   Вверх
SABROG
Дата 14.2.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Храни эскизы изображений в таблице и подгружай оттуда. Также посмотри класс QPixmapCache, может пригодится.
И посмотри флаг Qt::ImageConversionFlags у loadFromData.

А вообще в example'ах очень много примеров по работе с картинками. Смотри как там сделано.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
baggins
Дата 15.2.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 22.11.2008

Репутация: нет
Всего: нет



А можно поподробнее о потоке и области видимости? smile 
PM MAIL   Вверх
GRONN
Дата 17.2.2009, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 8.3.2007

Репутация: нет
Всего: нет



Согласен с SABROG - загружать надо именно эскизы, так и делаю. 

Прошу прощения, я сначала неправильно прочел вопрос и ответ мой (про потоки) скорее объясняет как я ускорял работу, а не уменьшал оперативу. 

Как можно использовать QPixmapCache. Если у тебя сверхкрупные превьюхи, то идея в том, что тебе абсолютно незачем хранить то, что не попадает в область видимости виджета, и по возможности удалять из оперативки.  Если ты используешь именно QListWidget, то не вижу, честно говоря, как это реализовать. 

А вот если ты унаследуешь QListWidget и немного модифицируешь, то сможешь сделать так:  QPixmapCache поможет тебе хранить только недавно использованные картинки, установи его лимит памяти какой тебе надо. А при прокрутке, т.е. обновлении области видимости,  (скажем, в функции paintEvent(), которую нужно переопределить), тебе нужно: 1. Проверить, есть ли нужная тебе картинка в QPixmapCache. 2. Если есть взять оттуда и отрисовать. 3. Если нет, то придется сообщить потоку загрузки из БД, что надо подгрузить такую-то картинку, после чего поток ее вернет твоему виджету, а тот заново себя перерисует, обнаружив при этом, что теперь нужная картинка есть в кэше.

Это общая схема. Тут есть несоклько тонкостей, например как организовывать загрузку из БД, как организовывать взаимодействие потоков и тому подобное. Но они все всплывут уже по мере решения задачи - это позже.

P.S. Взаимодействие с потоком, который выполняет длительную операцию (работа с графикой, сохранение файла, базы данных), очень хорошо описано в книге Бланшет и Саммерфилда по Qt 4 в главе 18 "Взаимодействие с главным потоком"
PM MAIL   Вверх
baggins
Дата 18.2.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 22.11.2008

Репутация: нет
Всего: нет



общая схема пока ясна, буду думать всем пасип! smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0671 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.