Frage

Ich muss den Zeichnungsprozess eines QGraphicsView anpassen, und so überschreibe ich die DrayItems -Methode wie folgt:

self.graphicsview.drawItems=self.drawer.drawItems

wo self.graphicsview ist eine qgraphicsview und self.drawer ist eine benutzerdefinierte Klasse mit einer Methode drawItems.
In dieser Methode überprüfe ich ein paar Flags, um zu entscheiden, wie Sie jedes Element zeichnen, und rufen Sie dann an item.paint, so was:

def drawItems(self, painter, items, options):
    for item in items:
        print "Processing", item
        # ... Do checking ...
        item.paint(painter, options, self.target)

self.target ist die QGraphicsScene von QGraphicsView.
Sobald es jedoch erreicht item.paint, Es bricht aus der Schleife aus - ohne Fehler. Wenn ich Bedingungen rund um das Gemälde stelle und für jede mögliche Art von QGraphicsItem den Code einfügen, der ausgeführt werden soll (indem ich die QT-Git-Sources betrachtet), funktioniert alles.
Keine sehr schöne Lösung ... und ich verstehe nicht, wie sie überhaupt aus der Schleife ausbrechen könnte?

War es hilfreich?

Lösung

Es gibt eine Ausnahme, die auftritt, wenn die Gegenstände gemalt sind, aber nicht sofort gemeldet wird. Auf meinem System (PYQT 4.5.1, Python 2.6) wird keine Ausnahme gemeldet, wenn ich die folgende Methode besiegte:

def drawItems(painter, items, options):
    print len(items)
    for idx, i in enumerate(items):
        print idx, i
        if idx > 5:
            raise ValueError()

Ausgabe:

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>

Sobald ich jedoch die Anwendung schließe, wird die folgende Methode gedruckt:

Exception ValueError: ValueError() in <module 'threading' from '/usr/lib/python2.6/threading.pyc'> ignored

Ich habe versucht zu drucken threading.currentThread(), aber es gibt den gleichen Thread zurück, unabhängig davon drawItems Methode.

In Ihrem Code ist dies wahrscheinlich darauf zurückzuführen, dass Sie bestehen options (Dies ist eine Liste von Stiloptionsobjekten) für die einzelnen Elemente und nicht für das jeweilige Optionsobjekt. Mit diesem Code sollten Sie die richtigen Ergebnisse geben:

def drawItems(self, painter, items, options):
    for item, option in zip(items, options):
        print "Processing", item
        # ... Do checking ...
        item.paint(painter, option, self.target)

Außerdem sagst du das self.target ist das Szenenobjekt. Das Dokumentation für paint() sagt:

Diese Funktion, die normalerweise von QGraphicsView aufgerufen wird, malt den Inhalt eines Elements in lokalen Koordinaten. ... Das Widget -Argument ist optional. Wenn es zur Verfügung gestellt wird, weist es auf das Widget hin, auf das er gemalt wird. Ansonsten ist es 0. Für zwischengespeichertes Malerei ist Widget immer 0.

Und der Typ ist QWidget*. QGraphicsScene Erben von QObject und ist kein Widget, daher ist es wahrscheinlich auch, dass dies auch falsch ist.

Die Tatsache, dass die Ausnahme überhaupt nicht gemeldet wird, oder nicht sofort deutet darauf hin, dass Sie sich an den Betreuer kontaktieren sollten.

Andere Tipps

Der Grund, warum die Schleife plötzlich ausgeht, ist, dass eine Ausnahme ausgelöst wird. Python geht nicht damit um (es gibt keine try: Block), also wird es an den aufgerufenen (QT's C ++ Code) übergeben, der keine Ahnung von Python -Ausnahmen hat, also ist er verloren.

Fügen Sie einen Versuch hinzu/außer um die Schleife und Sie sollten den Grund sehen, warum dies geschieht.

Hinweis: Seit Python 2.4 sollten Sie Methoden nicht mehr auf diese Weise außer Kraft setzen.

Stattdessen müssen Sie eine neue Klasse von QGraphicsView ableiten und Ihre hinzufügen drawItems() Methode zu dieser neuen Klasse. Dies ersetzt die ursprüngliche Methode ordnungsgemäß.

Vergessen Sie nicht anzurufen super() in dem __init__ Methode! Andernfalls funktioniert Ihr Objekt nicht richtig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top