我有一个简单的程序,它创建一个QGraphicsScene / View,然后执行一个给定的文件(通过python的exec语句),并导出一些globals函数。
我的目标是只在新文件中定义场景代码,并且已经定义了一些帮助函数。
我的主程序中也有一个提供回调的线程,我想做一些关于回调的qgraphicsitems的事情。
这里的示例定义了链接到一个回调的不可见动画:
from PySide import QtGui
# definition of an animation of invisibility
class AnimInvisible:
def __init__(self, item):
self.item = item
def on_callback(self, tag):
self.item.setVisible(tag.getProperty() != 0)
# creation of a simple QGraphicsRectItem
mon_rect = QtGui.QGraphicsRectItem(400, 300, 100, 50)
mon_rect.setBrush(QtGui.QBrush(QtGui.QColor('red')))
# this will add the rect to the scene defined in the file
# where the exec statement is done (exported by exec)
addItem(mon_rect)
a = AnimInvisible(mon_rect)
# this connect the a.on_callback on some changes from a thread. (exported from exec)
addCallback(a.on_callback, 'system:cmdamg')这个效果很好。但是现在,如果我将AnimInvisible的代码放在另一个模块(比如动画)中,我在上面的代码中替换为:
from animations import AnimInvisible我收到一个错误,说内部C++对象(PySide.QtGui.QGraphicsRectItem)已经删除了。
我不明白这是一种很奇怪的行为。我也尝试使用PyQt而不是PySide,我得到了相同的行为(当AnimInvisible的代码在一个模块中时,对象被删除了,如果它在同一个文件中也没有问题)。
发布于 2011-09-08 09:02:38
多亏了你的评论,我发现了这个问题。
我在做这样的事情:
class Synoptique:
def __init__(self, w, h):
self.view = QGraphicsView()
self.scene = SynopScene()
# some initialization ...
def openSynop(buApp, fname, w, h):
synop = Synoptique(w, h)
var_export = {
'addItem': synop.addItem,
'addCallback': buApp.addCallback,
}
exec open(fname) in var_export
synop.view.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
# buApp creation
openSynop(buApp, 'synop.py', 800, 600)
app.exec_()但是,似乎失去了对synop对象(包含QGraphicsView和场景)的引用,因为它是openSynop函数中的一个局部变量。所以引用了QGraphicsView,场景,以及场景中丢失的对象。
处理这一问题的一种方法是在函数之外的主调用中声明synop实例,或者从函数中返回和保存synop引用。这解决了我的问题,例如:
def openSynop(buApp, fname, w, h):
# same as before...
return synop
if __name__ == '__main__':
# same as before...
s = openSynop(buApp, 'synop.py', 800, 600)
app.exec_()现在我明白了,我必须在QGraphicsView /场景上保留一个引用,以便以后操作场景中的QGraphicsItem .哇,这对我来说不是很明显,再次感谢!
https://stackoverflow.com/questions/7281243
复制相似问题