gpt4 book ai didi

python - 当直接从文件而不是 QImage 制作时,PyQt 中的 QPixmaps 不会被正确清理

转载 作者:太空宇宙 更新时间:2023-11-04 02:43:18 25 4
gpt4 key购买 nike

考虑以下代码:

from PyQt4 import QtCore, QtGui, QtNetwork, QtWebKit


class ImageView(QtGui.QGraphicsView):

def __init__(self, file):
super().__init__()
self.setScene(QtGui.QGraphicsScene())
f = QtGui.QPixmap(QtGui.QImage(file))
# f = QtGui.QPixmap(file)
item = QtGui.QGraphicsPixmapItem(f)
self.scene().addItem(item)

def mousePressEvent(self, event):
self.scene().clear()

image = 'big.png'
app = QtGui.QApplication([])
view = ImageView(image)
view.show()
app.exec_()

在这里,我加载了一个大的 (10000x10000px) 图像并将其显示在 QGraphicsView 中,然后可以通过单击鼠标清除场景。如果使用 f = QtGui.QPixmap(QtGui.QImage(file)) 行,则在清除场景后,内存使用量从 400 Mb 下降到 20,表明图像已从内存中清除。但是,如果我用 f = QtGui.QPixmap(file) 替换该行,那么在执行相同操作后,内存使用量仍保持在 400 Mb。它也不会在以后重新分配——如果在清除场景后我用另一个大图像创建另一个 ImageView,则会分配另一个 block 。此外,当我直接从文件创建 QPixmap 时,我无法以任何方式释放内存 - 我尝试了 Python 的 deleteLaterdel 和 gc 模块。这在 PyQt 和 Pyside 中都会发生。为什么会这样?

最佳答案

采用文件名的QPixmap 方法将通过QPixmapCache 进行自动缓存。所以应该可以像这样释放内存:

QPixmapCache.clear()

Qt 文档声明对于桌面系统,QPixmapCache 的缓存限制为 10mb。但是,在实践中可能会超过此限制。其原因有些模糊,但查看源代码表明 Qt 使用了 QCache。 ,并将其 maxCost 设置为 cache_limit * 1024。但是,totalCost 的文档假设对于隐式共享类(例如 QPixmap),这可能会超出。

关于python - 当直接从文件而不是 QImage 制作时,PyQt 中的 QPixmaps 不会被正确清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45846651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com