Как загрузить изображение для QListWidgetItem в потоке?

В моем графическом интерфейсе я хочу загрузить несколько миниатюр изображений. Изображения имеют большой размер (возможно, 3mb).

Изображения, которые я хочу загрузить в потоке, чтобы графический интерфейс не зависал в это время. Для этого я протестировал загрузку изображения как QIcon в QRunnable:

  ImageLoader::ImageLoader(QListWidgetItem *item, QString path)
  {
   this->path=path;
   this->item=item;
   }

  void ImageLoader::run()
  {
    QIcon icon(path);
    item->setIcon(icon);
  }

Я назвал это QRunnable с помощью QThreadPool::globalInstance()->start(new ImageLoader(item,path));

Но затем возникает ошибка: «QPixmap: небезопасно использовать растровые изображения вне потока графического интерфейса».

Что сделать, чтобы гуй не завис?


person 501 - not implemented    schedule 07.10.2013    source источник


Ответы (1)


Используйте QImage. Его можно использовать из потоков, не связанных с графическим интерфейсом.

Загрузка QImage может быть выполнена в потоке без графического интерфейса, но тогда все, что касается графического интерфейса (в данном случае манипулирование QListWidgetItem), должно быть выполнено обратно в потоке графического интерфейса. Это нормально, потому что загрузка и декодирование изображения занимают большую часть времени.

Также см. эту статью об использовании QThread: http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/. Судя по вашему фрагменту кода, вы можете попасть в ловушку, описанную в документе.

person ksimons    schedule 07.10.2013
comment
@ksimons, хотя я согласен с тем, что лучше не создавать подкласс QThread, теперь есть продолжение этой статьи: woboq.com/blog/qthread-you-were-not-doing-so-wrong.html - person TheDarkKnight; 08.10.2013
comment
@ Merlin069 - такого не видел. Спасибо! - person ksimons; 08.10.2013