Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt4] Много thumbnail - последовательная загрузка


Автор: GRONN 9.10.2008, 23:38
Доброе время суток!

У меня есть собственный viewer, который отображает превьюшки картинок, загружаемых из удаленной БД. Дабы все не тормозило, я запускаю фоновый поток, который эти самые первиьшки загружает из базы, и отсылает вьюеру сигнал, дескать "я вот загрузил тебе этот тамбнэйл, ты его отобрази" (пока картинка не загружена, она отображается просто серым квадратиком).

Проблема:
Код

void PMView::receivedPreview(int row, QByteArray arr){
  QModelIndex index = model()->index(row, 0);
  QPixmap pix;
  pix.loadFromData(arr, "JPG");
  if(pix.width() > pixWidth){
    pix = pix.scaledToWidth(pixWidth);
  }
  if(pix.height() > pixHeight){
    pix = pix.scaledToHeight(pixHeight);
  }
  QPixmapCache::insert(model()->data(index, Qt::IdRole).toString(), pix);

  update(itemRegion(index));

}


это обработчик сигнала о приеме очередной картинки - он вызывает update, но как изветсно все такие update-ы  кэшируются "до лучших времен" - в итоге я получаю кучу серых квадратиков, которые не превращаются в картинки, пока я не ткну куда-нибудь мышкой, или передвину скролл на пару пикселей.

Как сделать немедленную отрисовку новой картинки? repaint ругается, говорит что paint engine is active.

Спасибо заранее!
С уважением, Алексей

Автор: GRONN 10.10.2008, 00:02
Вот так всегда, мучаешься два дня, потом постишь вопрос и сразу догадываешься. Ответ простой:
Код

  update(itemRegion(index));


itemRgion возвращает все в координатах вьюера (глобальных), а не вьюпорта. 
Правильно было так:
Код

  viewport()->update(visualRect(index));

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)