如何在线程中为 QListWidgetItem 加载图像?
Posted
技术标签:
【中文标题】如何在线程中为 QListWidgetItem 加载图像?【英文标题】:How to load Image for QListWidgetItem in a thread? 【发布时间】:2013-10-07 20:23:36 【问题描述】:在我的 GUI 中,我想从图像中加载几个缩略图。图片很大(可能 3mb)。
我想在一个线程中加载图像,这样 GUI 就不会在此时冻结。
为此,我测试了将图像作为QIcon
加载到QRunnable
中:
ImageLoader::ImageLoader(QListWidgetItem *item, QString path)
this->path=path;
this->item=item;
void ImageLoader::run()
QIcon icon(path);
item->setIcon(icon);
我用QThreadPool::globalInstance()->start(new ImageLoader(item,path));
调用这个 QRunnable
但是有一个错误:“QPixmap:在 GUI 线程之外使用像素图是不安全的”。
我该怎么做才能使 gui 不冻结?
【问题讨论】:
【参考方案1】:使用 QImage。它可以在非 gui 线程中使用。
加载 QImage 可以在非 gui 线程中完成,但是任何接触 GUI(在本例中是操作 QListWidgetItem)都必须在 gui 线程中完成。这没关系,因为大部分时间都是加载和图像解码。
另外,关于QThread的使用请看这篇文章:https://www.qt.io/blog/2010/06/17/youre-doing-it-wrong。根据您的代码 sn-p,您可能会陷入文档中描述的陷阱。
【讨论】:
@ksimons,虽然我同意最好不要继承 QThread,但现在有一篇文章跟进:woboq.com/blog/qthread-you-were-not-doing-so-wrong.html @Merlin069 - 没见过那个。谢谢!以上是关于如何在线程中为 QListWidgetItem 加载图像?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Qlistwidgetitem 文本与图标垂直对齐?