我在尝试如何在pyqtqlistview中正确地完成异步映像加载。在

我的主小部件由一个Qlistview和一个QLineEdit文本框组成。

我有一个参与者数据库,我使用QAbstractListModel的子类查询该数据库,当文本输入到文本框中时,数据库被查询,并用结果填充模型。结果随后显示在Qlistview中。(每个Actor的结果包含actors的名称和图像的路径。)

是这样的:

当结果集太大(大于50)时,问题就开始了,从磁盘加载图像会使用户界面挂起。我希望实现的行为是首先为所有结果加载一个占位符图像,然后在另一个线程中从磁盘加载特定的映像,加载后用新加载的映像更新Qlistview项。在

为此,我创建了一个自定义的QItemDelegate类,该类包含所有需要加载的图像的缓存。如果图像不在缓存中,那么它将绘制占位符图像并向另一个线程发送信号,该线程加载该图像并将其放入缓存中。在

我的代表课程:class MyDelegate(QStyledItemDelegate):

t1 = pyqtSignal(str, str, dict)

def __init__(self, image_cache, loader_thread, parent=None):

super(MyDelegate, self).__init__(parent)

self.placeholder_image = QPixmap(PLACEHOLDER_IMAGE_PATH).scaled(200, 300)

self.image_cache = image_cache

self.loader_thread = loader_thread

self.t1.connect(self.loader_thread.insert_into_queue)

def paint(self, QPainter, QStyleOptionViewItem, QModelIndex):

rect = QStyleOptionViewItem.rect

actor_name = QModelIndex.data(Qt.DisplayRole)

actor_thumb = QModelIndex.data(Qt.UserRole)

pic_rect = QRect(rect.left(), rect.top(), 200, 300)

text_rect = QRect(rect.left(), rect.top() + 300, 200, 20)

try:

cached_thumb = self.image_cache[actor_name]

print("Got image: {} from cache".format(actor_name)

except KeyError as e:

self.t1.emit(actor_name, actor_thumb, self.image_cache)

cached_thumb = self.placeholder_image

print("Drawing placeholder image for {}".format(actor_name)

QPainter.drawPixmap(pic_rect, cached_thumb)

QPainter.drawText(text_rect, Qt.AlignCenter, actor_name)

if QStyleOptionViewItem.state & QStyle.State_Selected:

highlight_color = QStyleOptionViewItem.palette.highlight().color()

highlight_color.setAlpha(50)

highlight_brush = QBrush(highlight_color)

QPainter.fillRect(rect, highlight_brush)

def sizeHint(self, QStyleOptionViewItem, QModelIndex):

return QSize(200, 320)

加载线程:

^{pr2}$

主窗口__init__方法的相关部分:image_cache = {}

lt = loader_tread.LoaderThread()

self.thread = QThread()

lt.moveToThread(self.thread)

self.thread.start()

self.delegate = MyDelegate(image_cache, lt)

虽然这种方法似乎在正确加载图像的情况下有效,但是在MyDelegate中多次调用self.t1.emit(actor_name, actor_thumb, self.image_cache)时,UI会挂起。在

实际上,延迟与图像加载到同一线程中时几乎相同,如下所示:try:

cached_thumb = self.image_cache[actor_name]

print("Got image: {} from cache".format(QModelIndex.data(Qt.DisplayRole)))

except KeyError as e:

# self.t1.emit(actor_name, actor_thumb, self.image_cache)

pixmap = QPixmap(actor_thumb).scaled(200,300)

self.image_cache[actor_name] = pixmap

cached_thumb = self.image_cache[actor_name]

如果有人对我做错了什么或如何实现期望的行为有任何建议,他们会很受欢迎的。在

附言

我知道我可以限制数据库查询中的结果集,但是这不是我想要做的。在

python异步加载图片_如何在PyQt5中正确异步加载图像?相关推荐

  1. 合并的表格怎么加横线_如何在excel中文字后面加横线

    如何在excel中文字后面加横线以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如何在excel中文字后面加横线 好办啊 ...

  2. outlook 加载配置项_如何在Outlook中启用加载项和连接器

    outlook 加载配置项 There are a lot of third-party add-ins and connectors available for Outlook. What's th ...

  3. python画图修改背景颜色_如何在 Matplotlib 中更改绘图背景的实现

    介绍 Matplotlib是Python中使用最广泛的数据可视化库之一.无论是简单还是复杂的可视化项目,它都是大多数人的首选库. 在本教程中,我们将研究如何在Matplotlib中更改绘图的背景. 导 ...

  4. 选下拉框的的值对应上传相应的图片_如何在excel中实现,选择下拉菜单某一项,该表格中就出现选项对应的数据?(excel表格制作选择数据)...

    怎样从多个excel表格中提取数据,做数据分析图呢 1. 数据的.录入.表格的设置,效果如示. 2.如图所示,选进行分析的图据范围 3.如图所示,点击菜单栏目上的"插入",选择&q ...

  5. 用python画奔驰的标志_如何在CATIA中快速画一个奔驰车标

    原标题:如何在CATIA中快速画一个奔驰车标 咱们这个公众号呀,总是发一些二次开发啊,代码啊什么的,这观众看的啊,是云里雾里的!哎,内位说了:您能不能讲点儿我们听的懂的内容啊?那好,今儿咱们就来说说, ...

  6. unity保存加载慢_掌握Unity 5中的保存和加载功能

    unity保存加载慢 Thanks to Vincent Quarles for kindly helping to peer review this article. 感谢Vincent Quarl ...

  7. qgis 图片_如何在QGIS中添加自定义的Mapbox底图?

    MapBox提供的底图产品是我目前最喜欢的两个地图源之一.他们除了Studio供用户自定义底图外,还提供了一个更为简单的Cartogram站点,用户只需上传一张图片,系统会自动根据图片色系定义一份特色 ...

  8. python怎么交换xy轴_如何在matplotlib中更改x和y轴?

    代码中的内容是如何在matplotlib中启动直方图的示例.注意,您使用的是pyplot默认接口(不一定要构建自己的图形). 因此这一行:orientation=u'vertical', 应该是:or ...

  9. java中为按钮添加图片_如何在Java中为字符串添加双引号?

    java中为按钮添加图片 In Java, everything written in double-quotes is considered a string and the text writte ...

最新文章

  1. BZOJ 4817: [Sdoi2017]树点涂色
  2. 对于随机过程方面书籍的评论(转贴)
  3. winform 统计大量数据重复的元素个数_面试系列:十个海量数据处理方法大总结...
  4. 首届渣打科营编程马拉松赛初赛圆满结束
  5. 利用计算机打字教学设计,第6课 争当打字小能手教学设计
  6. php 数据库查重,使用SimHash进行海量内容数据查重 - PHP版
  7. 科研绘图自由之开放式绘图平台 (Figdraw)
  8. Linux(Ubuntu 22.04)学习笔记——让虚拟机共享主机上的文件夹
  9. Frogs(找规律 + 容斥)
  10. 微信小程序不同身份登录,显示不同的tabbar(导航栏)
  11. java web 有什么区别吗_web和java一样吗?有什么区别?
  12. WPS—JS宏笔记记录
  13. 世纪佳缘再出事故,区块链能成为搅动婚恋行业的新鲶鱼吗?
  14. TUP第19期综述:从12306看海量并发网站架构
  15. 原生JS中的三大家族(offset/scroll/client)与jQuery中对应的方法
  16. 对php的感受100字_团建活动后的感想50字-100字《5篇》
  17. 导入项目时红色小时钟的处理办法
  18. 软件功能测试订票系统,QTP自动化测试自带订票系统登录功能
  19. 华为云计算IE面试笔记-华为云计算解决方案业务迁移支持哪些迁移?有哪些特点?请描述基本的业务交付流程、业务迁移流程和原则。
  20. 修改 Outlook 数据文件默认保存位置

热门文章

  1. 神经网络一般训练多少次,神经网络训练时间太长
  2. 天梯 L2-028 秀恩爱分得快
  3. 学计算机专业可以学师范吗,师范学校的计算机专业,出来好找工作吗?有何方向?...
  4. php面试题常见面试题
  5. 磁盘、柱面、磁道、磁头、扇区详解
  6. 强制 html5 播放,关于HTML5 video标签在安卓版微信浏览器内被强制全屏播放的问题...
  7. 12款漂亮 WordPress 免费主题分享
  8. shopify 前端开发遇到的问题及解决(部分)
  9. ia64linux内核:设计与实现,The Linux/ia64 project: kernel design and status update
  10. 利用Putty建立SSH的tunnels访问内网资源