绘制项目时会发生异常,但不会立即报告。在我的系统(PyQt 4.5.1,Python 2.6)上,当我对以下方法进行猴子补丁时,没有报告异常:
def drawItems(painter, items, options):
print len(items)
for idx, i in enumerate(items):
print idx, i
if idx > 5:
raise ValueError()
输出:
45
0 <PyQt4.QtGui.QGraphicsPathItem object at 0x3585270>
1 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356ca68>
2 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356ce20>
3 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356cc88>
4 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356cc00>
5 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356caf0>
6 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356cb78>
但是,一旦我关闭应用程序,就会打印以下方法:
Exception ValueError: ValueError() in <module 'threading' from '/usr/lib/python2.6/threading.pyc'> ignored
我试过打印,但无论是在猴子补丁方法threading.currentThread()
内部还是外部调用,它都会返回相同的线程。drawItems
在您的代码中,这可能是由于您将options
(样式选项对象的列表)传递给单个项目而不是相应的选项对象。使用此代码应该会给您正确的结果:
def drawItems(self, painter, items, options):
for item, option in zip(items, options):
print "Processing", item
# ... Do checking ...
item.paint(painter, option, self.target)
另外,您说的self.target
是场景对象。的文档paint()
说:
该函数通常由 QGraphicsView 调用,以局部坐标绘制项目的内容。... widget 参数是可选的。如果提供,它指向正在绘制的小部件;否则为 0。对于缓存的绘画,小部件始终为 0。
类型是QWidget*
. QGraphicsScene
继承自QObject
并且不是小部件,因此这也可能是错误的。
尽管如此,该异常根本没有报告,或者没有立即报告,这表明存在一些不正当行为,您应该联系维护者。