我需要定制的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*QGraphicsSceneQObject继承并且不是一个小部件,所以很可能这是错误的,也

不过,该异常不能在所有报告的,或不是马上的这个事实,一些犯规动作,你应该联系维护者。

其他提示

为什么循环突然离开的原因是,一个则抛出异常。 Python不处理它(不存在try:块),所以它的传递给被调用(Qt的C ++代码)不具有关于Python例外的想法,所以它的丢失。

添加一个try /除了周围的循环,你应该明白为什么出现这种情况的原因。

请注意:因为Python 2.4,你不应该重写方法了这样

相反,你必须获得来自的QGraphicsView一个新的类,并添加您的drawItems()法这个新类。这将适当地替换原来的方法。

不要忘记调用super()__init__方法!否则,你的对象将不能正常工作。

scroll top