Skip to main content
 首页 » 编程设计

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

2024年10月01日38虾米姐

考虑以下代码:

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),这可能会超出。