QPixmaps在PyQt的意思时,从文件而不是从QImage的

问题描述:

直接作出不正确清理,请看下面的代码:QPixmaps在PyQt的意思时,从文件而不是从QImage的

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,则会分配另一个大块。而且,当我直接从文件创建QPixmap时,我无法以任何方式释放内存 - 我尝试了Python的deleteLater,del和gc模块。这在PyQt和Pyside都会发生。这是为什么发生?

+2

尝试:'QPixmapCache.clear()'。 – ekhumoro

+0

@ekhumoro哇,这有帮助。两个问题:1)Qt文档说,桌面上的缓存限制是10 Mb。为什么它变得比这更大? 2)为什么从QImage制作它时不会发生这种情况?不确定。( – Dariush

+0

)(1)不确定。可能需要阅读源代码才能看到实际发生的情况。 (2)只有采用自动缓存的文件名的'QPixmap'方法。 – ekhumoro

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

QPixmapCache.clear() 

Qt的文档状态为QPixmapCache缓存限制是10MB的桌面系统。但是,这个限制在实践中可能会超出。其原因有些模糊,但从源头上看,Qt使用QCache,并将其maxCost设置为cache_limit * 1024。但是,totalCost的文档说,这可能会超出隐式共享类(例如QPixmap)。