Как загрузить изображение для QListWidgetItem в потоке?
В моем графическом интерфейсе я хочу загрузить несколько миниатюр из изображений. Изображения имеют большой размер (возможно, 3 МБ).
Изображения, которые я хочу загрузить в поток, чтобы графический интерфейс не зависал в это время. Для этого я проверил, чтобы загрузить изображение как 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: небезопасно использовать растровые изображения вне потока GUI".
Что я могу сделать, чтобы графический интерфейс не зависал?
1 ответ
Используйте QImage. Может использоваться из не-графических потоков.
Загрузка QImage может быть выполнена в потоке не-GUI, но тогда все, что касается GUI (в этом случае манипулирование QListWidgetItem), должно быть выполнено обратно в поток GUI. Это нормально, потому что загрузка и декодирование изображения занимают большую часть времени.
Также ознакомьтесь с этой статьей об использовании QThread: http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/. Исходя из вашего фрагмента кода, похоже, что вы попали в ловушку, описанную в документе.