gpt4 book ai didi

python - 为什么 QGraphicsScene 的这种实现会导致应用程序在退出时崩溃?

转载 作者:行者123 更新时间:2023-12-01 05:04:59 27 4
gpt4 key购买 nike

我使用Qt的图形 View 框架来显示大量图像,并使用PyQt4和Python 2.7来实现它。我实例化了许多 QPixmapItem 对象并将它们添加到我的 QGraphicsScene 中。一切都按照我的预期工作,直到我退出应用程序,并且程序崩溃而不是正常退出。

class ImgDisplay(QtGui.QWidget):
NUM_ITEMS = 5000

VIEW_WIDTH,VIEW_HEIGHT = 400, 400

def __init__(self):
super(ImgDisplay, self).__init__()

self.scene = QtGui.QGraphicsScene(QtCore.QRectF(0,0,ImgDisplay.VIEW_WIDTH,ImgDisplay.VIEW_HEIGHT))

self.view = QtGui.QGraphicsView(self.scene)
self.view.setParent(self)

#Load the texture
self.texture = QtGui.QPixmap('image.png')

self.populateScene()

def populateScene(self):

for i in range(0, ImgDisplay.NUM_ITEMS-1):
item = QtGui.QGraphicsPixmapItem(self.texture)

self.scene.addItem(item)

我认为我正在创建的所有这些 PixMapItems 都没有被正确清理,或者我可能需要释放我加载的纹理(似乎没有办法释放它,所以我假设它发生在后台)。

我尝试在析构函数中调用 self.scene.clear 来删除 PixmapItems,但没有帮助。

关于如何解决这个问题有什么建议吗?

*我知道发布的代码只是将图像全部放在彼此之上,我的实际程序为它们分配随机位置和旋转,但我想将其减少到最小问题。

最佳答案

好的,明白了。问题是 QtGui.QGraphicsPixmapItem 无法清除自身,您必须像您所说的那样手动操作,但不能使用析构函数。我建议在发出信号后使用 closeEvent 关闭程序,如下所示;

def closeEvent (self, eventQCloseEvent):
self.scene.clear() # Clear QGraphicsPixmapItem
eventQCloseEvent.accept() # Accept to close program

这实现了您的代码;

import sys
from PyQt4 import QtCore, QtGui

class ImgDisplay (QtGui.QWidget):
NUM_ITEMS = 5000
VIEW_WIDTH,VIEW_HEIGHT = 400, 400

def __init__ (self):
super(ImgDisplay, self).__init__()
self.scene = QtGui.QGraphicsScene(QtCore.QRectF(0,0,ImgDisplay.VIEW_WIDTH,ImgDisplay.VIEW_HEIGHT))
self.view = QtGui.QGraphicsView(self.scene)
self.view.setParent(self)
#Load the texture
self.texture = QtGui.QPixmap('image.png')
self.populateScene()

def populateScene (self):
for i in range(0, ImgDisplay.NUM_ITEMS-1):
item = QtGui.QGraphicsPixmapItem(self.texture)
self.scene.addItem(item)

def closeEvent (self, eventQCloseEvent):
self.scene.clear()
eventQCloseEvent.accept()

app = QtGui.QApplication([])
window = ImgDisplay()
window.show()
sys.exit(app.exec_())

我使用 PyQt4 (Windows 7)。

这对于实现关闭事件很有用,希望有帮助;

QWidget关闭事件引用:http://pyqt.sourceforge.net/Docs/PyQt4/qwidget.html#closeEvent

<小时/>

最后编辑:2014 年 8 月 11 日 01:51

如果你想控制你的父子小部件一起删除,我必须实现析构函数方法(正如你所说)。通过使用安全删除方法QObject.deleteLater(self),像这样;

import sys
from PyQt4 import QtCore, QtGui

class ImgDisplay (QtGui.QWidget):
NUM_ITEMS = 5000
VIEW_WIDTH, VIEW_HEIGHT = 400, 400

def __init__ (self, parent = None):
super(ImgDisplay, self).__init__(parent)
self.scene = QtGui.QGraphicsScene(QtCore.QRectF(0,0,ImgDisplay.VIEW_WIDTH,ImgDisplay.VIEW_HEIGHT), parent = self)
self.view = QtGui.QGraphicsView(self.scene, parent = self)
#Load the texture
self.texture = QtGui.QPixmap('image.png')
self.populateScene()

def populateScene (self):
for i in range(0, ImgDisplay.NUM_ITEMS-1):
item = QtGui.QGraphicsPixmapItem(self.texture)
self.scene.addItem(item)

def __del__ (self):
self.deleteLater() # Schedules this object for deletion

app = QtGui.QApplication([])
window = ImgDisplay()
window.show()
sys.exit(app.exec_())

警告:不要忘记在小部件中设置父级! (因为有些时候它无法自行删除。)

删除稍后引用:http://pyqt.sourceforge.net/Docs/PyQt4/qobject.html#deleteLater

<小时/>

问候,

关于python - 为什么 QGraphicsScene 的这种实现会导致应用程序在退出时崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25218486/

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