考虑以下代码:
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 的 deleteLater、del 和 gc 模块。这在 PyQt 和 Pyside 中都会发生。为什么会这样?
请您参考如下方法:
采用文件名的QPixmap 方法将通过QPixmapCache 进行自动缓存。所以应该可以像这样释放内存:
QPixmapCache.clear()
Qt 文档声明对于桌面系统,QPixmapCache 的缓存限制为 10mb。但是,在实践中可能会超过此限制。其原因有些模糊,但查看源代码表明 Qt 使用了 QCache。 ,并将其 maxCost 设置为 cache_limit * 1024。但是,totalCost 的文档假设对于隐式共享类(例如 QPixmap),这可能会超出。
