显示pixmaps

时间:2016-01-27 10:36:26

标签: python qt pyside

我正在使用Python和Qt通过PySide为数据可视化编程GUI应用程序。 我偶尔会遇到崩溃('python.exe已经停止工作'),我认为我已经缩小到以下问题:

当从numpy数组创建pixmap时,即使pixmap已经存在,内存也会被python(?)释放。 如果使用的图像格式为QImage.Format_ARGB32,则不会发生这种情况。(为什么不呢?)。看看下面的代码示例,我希望你能重现这个问题。

编辑:澄清 - 如果python没有删除numpy数组,一切都按预期工作。但是,在我的应用程序中,不断生成新数据,我必须找到一种很好的方法来跟踪当前显示为像素图的数据集,并在它不再显示时立即将其删除。我想找到正确的方法让Qt处理(图像)数据并将其存储在内存中,直到不再需要为止。

据我了解QtPySide的文档,pixmap应该包含图像的所有数据,因此Qt应该负责内存管理。

这是Qt,Pyside中的错误,还是我不明白?我在常规文档中找不到有关内存管理的任何细节。

背景:我需要定期更新要显示的数据,因此可能会发生在创建像素图并显示它之间,numpy数据数组已被python覆盖(因为涉及一些CPU密集型线程有时会减慢GUI)。因此,永远存储numpy数组不是一种选择。

这是一个代码示例,有趣的位发生在display_image方法中:

import numpy as np
from PySide import QtCore, QtGui
import sys

class displaywidget(QtGui.QWidget):
    def __init__(self,parent = None):
        super(displaywidget, self).__init__(parent)

        ## set up the GUI elements
        self.setLayout(QtGui.QGridLayout())
        self.view = QtGui.QGraphicsView()
        self.layout().addWidget(self.view)        
        self.scene = QtGui.QGraphicsScene()
        self.view.setScene(self.scene)

        # create a pixmap and display it on the graphicsview
        self.display_image()
    def display_image(self):
        # create image data in numpy array
        size = 1024
        r = np.linspace(0,255, num = size**2, dtype = np.uint32)
        argb = (r<<16) +(255<<24)

        # image should display a black to red shading
        image = QtGui.QImage(argb, size,size, size*4, QtGui.QImage.Format_RGB32)

        ### using ARGB format option does not cause the problem
#        image = QtGui.QImage(argb, size,size, size*4, QtGui.QImage.Format_RGB32)

        pixmap = QtGui.QPixmap.fromImage(image)

        self.scene.addPixmap(pixmap)
        ### when the image data is stored, everything works fine, too
#        self.cache = argb
        ### if only the pixmap and image is stored, the problem still exists
#       self.cache = [pixmap, image]



def main(argv):
    ## create application and main window
    try:
        app = QtGui.QApplication(argv)
        new_qtapp = True
    except:
        new_qtapp = False
    mainwindow = QtGui.QMainWindow()
    mainwindow.setCentralWidget(displaywidget())
    mainwindow.show()
    if new_qtapp:
        sys.exit(app.exec_())
    return mainwindow
if __name__=="__main__":
    w = main(sys.argv)

我在通用的Windows7 Office PC上使用32位Python 2.7.6和PySide 1.2.2。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这个简单的更改可以防止图像在功能完成时被垃圾收集。这似乎是导致问题的原因

self.argb = (r<<16) +(255<<24)

# image should display a black to red shading
image = QtGui.QImage(self.argb, size,size, size*4, QtGui.QImage.Format_RGB32)

enter image description here