4

QGraphicsView の描画プロセスをカスタマイズする必要があるため、次のように drawItems メソッドをオーバーライドします。

self.graphicsview.drawItems=self.drawer.drawItems

self.graphicsviewQGraphicsView で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.targetQGraphicsView の QGraphicsScene です。
ただし、 に達するitem.paintと、エラーなしでループから抜け出します。絵画の周りに条件を配置し、可能なタイプの QGraphicsItem ごとに、実行されるはずのコードを (Qt git-sources を参照して) 貼り付けると、すべてが機能します。
しかし、あまり良い解決策ではありません...そして、それがどのようにループから抜け出すことができるのか理解できませんか?

4

2 に答える 2

3

アイテムがペイントされるときに発生する例外がありますが、すぐには報告されません。私のシステム(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、ウィジェットではないため、これも間違っている可能性があります。

それでも、例外がまったく報告されていない、またはすぐに報告されていないという事実は、何らかの不正行為を示唆しているため、メンテナに連絡する必要があります。

于 2009-07-17T13:58:52.113 に答える
1

ループが突然終了する理由は、例外がスローされるためです。Python はそれを処理しない (try:ブロックがない) ため、呼び出された (Qt の C++ コード) に渡されますが、これは Python の例外を認識していないため、失われます。

ループの周りに try/except を追加すると、これが発生する理由がわかるはずです。

注: Python 2.4 以降、この方法でメソッドをオーバーライドしないでください。

代わりに、QGraphicsView から新しいクラスを派生させ、drawItems()この新しいクラスにメソッドを追加する必要があります。これにより、元のメソッドが適切に置き換えられます。

メソッドを呼び出すことsuper()を忘れないでください。__init__そうしないと、オブジェクトが正しく機能しません。

于 2009-07-17T13:20:47.603 に答える