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 Git-Sourcesを見ることで)貼り付けた場合、すべてが機能します。
しかし、あまり良い解決策ではありません...そして、私はそれがどのようにループから抜け出すことができるか理解していませんか?
解決
アイテムが塗装されたときに発生する例外がありますが、すぐには報告されません。私のシステム(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によって呼ばれるこの関数は、ローカル座標でアイテムの内容をペイントします。 ...ウィジェット引数はオプションです。提供されている場合、塗装されているウィジェットを指します。それ以外の場合は、0です。キャッシュされた塗装の場合、ウィジェットは常に0です。
そして、タイプはです QWidget*
. QGraphicsScene
継承します QObject
ウィジェットではないので、これも間違っている可能性があります。
それでも、例外がまったく報告されていないか、すぐにはファウルプレイを示唆しているという事実は、メンテナーに連絡する必要があります。
他のヒント
ループが突然終了する理由は、例外がスローされているためです。 Pythonはそれを処理しません(ありません try:
ブロック)、そのため、Pythonの例外については知らない呼び出された(QTのC ++コード)に渡されるため、失われます。
ループの周りを除いてtry/を追加すると、これが起こる理由がわかります。
注:Python 2.4なので、この方法でメソッドをオーバーライドしてはいけません。
代わりに、qgraphicsviewから新しいクラスを導き出し、追加する必要があります drawItems()
この新しいクラスの方法。これにより、元の方法が適切に置き換えられます。
電話することを忘れないでください super()
の中に __init__
方法!それ以外の場合、オブジェクトは適切に機能しません。