Russian Qt Forum
Ноябрь 25, 2024, 02:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Последовательное отображение картинок для QlistWidget  (Прочитано 7360 раз)
vvvxmag
Гость
« : Январь 29, 2011, 18:04 »

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



Вопрос: как узнать какие именно итемы сейчас в области отображения?

Тогда можно было бы только для них грузить картинки и все было бы значительно легче.
Записан
kdm
Гость
« Ответ #1 : Январь 29, 2011, 19:35 »

В билдере были такие средства. А что сейчас приходит на ум, то это когда айтем показывается, у него вызывается метод рисования. Может быть перехватывать этот event и тогда делать что надо? К примеру можно это делать installEventFilter и сделать собственный класс, который будет обрабатывать перехватываемые события. Как вариант. В замешательстве
Записан
Kolobok
Гость
« Ответ #2 : Январь 29, 2011, 20:15 »

Используй QListView
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #3 : Январь 29, 2011, 21:46 »

я так делал, задавал setRowCount() сразу на все количество строк и отдельный тред посылал сигналы с указателями на данные которые постепенно заполнялись, и можно убить тред если надо перегрузить таблицу не дожидаясь догрузки
работало моментально, пользователь не успевает прокрутку докрутить до не загруженной области
« Последнее редактирование: Январь 29, 2011, 21:48 от IGHOR » Записан
shirushizo
Гость
« Ответ #4 : Январь 30, 2011, 12:28 »

...
Вопрос: как узнать какие именно итемы сейчас в области отображения?
...

Методы:
Код:
QModelIndex QAbstractItemView::indexAt ( const QPoint & point ) const   [pure virtual]

QListWidgetItem* QListWidget::itemAt(const QPoint & p) const
QListWidgetItem* QListWidget::itemAt(int x, int y) const

Собстно:
Код:
int min_row = listWidget->indexAt(QPoint(0,0)).row();
int max_row = listWidget->indexAt(QPoint(listWidget->width()-10,listWidget->height()-10)).row();
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Январь 30, 2011, 12:50 »

Вычисление "а кто там видимый" утомительно. Я бы унаследовался от QIcon и грузил бы картинку из кэша для paint и др. перекрытых методов. Кэш сам вытеснит неиспользуемые картинки, нужно только подобрать размер.
Записан
vvvxmag
Гость
« Ответ #6 : Январь 30, 2011, 13:57 »

Не очень понял про QIcon? про какой кэш идет речь?

Попробую воспользоваться QListView.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Январь 30, 2011, 14:37 »

Не очень понял про QIcon? про какой кэш идет речь?

Попробую воспользоваться QListView.
То же самое.

Код
C++ (Qt)
QVariant MyModel::data( const QModelIndex & index, int role ) const
{
QString name = GetName(index);  // в модели храним только имена файлов картинок
QIcon * icon = theIconCache[name];   // картинка есть в кэше?
if (!icon) {
 icon = new QIcon(name);    // загрузили
 theIconCache.insert(name, icon);  // добавили в кэш
}
return QVariant(*icon);
}
 
Записан
vvvxmag
Гость
« Ответ #8 : Январь 30, 2011, 17:54 »

Когда мы будем запихивать в кэш QIcon он будет сжирать очень много памяти.
Насколько я понимаю, когда загружается картинка jpg она в памяти раскрывается и начинает занимать места больше чем на диске (не знаю как точнее выразить мысль), в итоге получим что 20 метров картинок на диске превращаются в 500 метров в памяти. Или такое происходит только если использовать QPixmap? А QIcon не жрет столько памяти?

Я хочу что бы в памяти были загружены только те картинки, которые отображаются.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Январь 30, 2011, 18:24 »

Когда мы будем запихивать в кэш QIcon он будет сжирать очень много памяти.
Насколько я понимаю, когда загружается картинка jpg она в памяти раскрывается и начинает занимать места больше чем на диске (не знаю как точнее выразить мысль), в итоге получим что 20 метров картинок на диске превращаются в 500 метров в памяти. Или такое происходит только если использовать QPixmap? А QIcon не жрет столько памяти?

Я хочу что бы в памяти были загружены только те картинки, которые отображаются.

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

QIcon - просто для примера, используйте что Вам надо (может QImage, QPixmap). Когда Вы помещаете новую картинку в кэш, наименее используемые удаляются кэшем автоматычно (т.е. что и требуется).
Записан
Kolobok
Гость
« Ответ #10 : Январь 30, 2011, 18:29 »

Для этого есть QPixmapCache.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Январь 30, 2011, 18:46 »

Для этого есть QPixmapCache.
Во блин "система" - не успеешь подумать, а это за тебя уже сделали!
Хотя впрочем кто знает, хорошо это или плохо...
Записан
vvvxmag
Гость
« Ответ #12 : Январь 30, 2011, 19:45 »

Огромное всем спасибо!!!!!
Особенно за проявленное терпение и разъяснения.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.169 секунд. Запросов: 23.