Существует исключение, которое происходит, когда элементы окрашиваются, но об этом не сообщается сразу. В моей системе (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
является объектом сцены.documentation for paint()
говорит:
Эта функция, которая обычно вызывается QGraphicsView, рисует содержимое элемента в локальных координатах. ... Аргумент виджета не является обязательным. Если он предоставлен, он указывает на виджет, который нарисован; в противном случае это 0. Для кешированной живописи виджет всегда равен 0.
и тип QWidget*
. QGraphicsScene
наследует от QObject
и не является виджетами, поэтому вполне вероятно, что это тоже неправильно.
Тем не менее, факт, что исключение не сообщается вообще или не сразу, предполагает какую-то нечестную игру, вы должны связаться с сопровождающим.
Просто попробовал добавить этот оператор 'print item.paint', чтобы проверить, какой метод рисования будет вызываться. Он напечатал «<встроенную краску метода объекта QGraphicsPixmapItem в 0x02295588>». Встроенный? У меня также есть пользовательский объект, полученный из QGraphicsItem, и выше оператор дает «связанный метод ...». Что означает эта разница? – carlpett
«встроенный» означает, что скомпилированный код в библиотеке Qt вызывается, а «связанный метод» означает, что вызывается код Python. –