PyQt的:重写QGraphicsView.drawItems
题
我需要定制的QGraphicsView的绘制过程,所以我重写drawItems这样方法:
self.graphicsview.drawItems=self.drawer.drawItems
其中self.graphicsview
是的QGraphicsView,和self.drawer
是具有方法drawItems
的自定义类。结果
在这种方法中我检查了几个标志来决定如何绘制每个项目,然后调用item.paint
,像这样的:
def drawItems(self, painter, items, options):
for item in items:
print "Processing", item
# ... Do checking ...
item.paint(painter, options, self.target)
self.target
是的QGraphicsView的QGraphicsScene。结果
然而,一旦达到item.paint
,它打破了循环 - 没有任何错误。如果我把条件语句周围的绘画,并为每个可能的类型的QGraphicsItem的粘贴应该被执行(通过看的Qt混帐来源)的代码,一切正常。结果
没有一个很好的解决方案,但...我不明白它如何收支平衡圈外的?
解决方案
有是当项目被画时发生了异常,但不是马上报告。在我的系统(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
场合对象。 说,文档:
这个功能,这通常是由所谓的QGraphicsView,涂料在本地坐标中的项目的内容。 ......小部件参数可选。如果提供,它指向的是被画上的工具;否则,它是0。对于缓存绘画,小窗口始终为0。
和类型是QWidget*
。 QGraphicsScene
从QObject
继承并且不是一个小部件,所以很可能这是错误的,也
不过,该异常不能在所有报告的,或不是马上的这个事实,一些犯规动作,你应该联系维护者。
其他提示
为什么循环突然离开的原因是,一个则抛出异常。 Python不处理它(不存在try:
块),所以它的传递给被调用(Qt的C ++代码)不具有关于Python例外的想法,所以它的丢失。
添加一个try /除了周围的循环,你应该明白为什么出现这种情况的原因。
请注意:因为Python 2.4,你不应该重写方法了这样
相反,你必须获得来自的QGraphicsView一个新的类,并添加您的drawItems()
法这个新类。这将适当地替换原来的方法。
不要忘记调用super()
在__init__
方法!否则,你的对象将不能正常工作。