質問

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__ 方法!それ以外の場合、オブジェクトは適切に機能しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top