2009-07-21 7 views
0

J'ai écrit ma propre implémentation de QGraphicsView.drawItems(), pour répondre aux besoins de mon application. La méthode en tant que telle fonctionne bien, cependant, elle est appelée à plusieurs reprises, même si elle n'a pas besoin d'être redessinée. Cela provoque l'application pour maximiser l'utilisation du processeur.
Ai-je besoin de signaler en quelque sorte que le dessin est terminé? J'ai lu la source dans l'arbre git, et je ne pouvais pas voir une telle chose se faire.
L'application est en Python/PyQt, et mon tirage méthode ressemble à ceci:Qt GraphicsScene constamment redessiner

def drawItems(self, painter, items, options): 
    markupColors={'manual':QColor(0, 0, 255), 
        'automatic':QColor(255, 0, 0), 
        'user':QColor(0, 255, 0)} 

    for index in xrange(len(items)): 
     item=items[index] 
     option=options[index] 

     dataAsInt, dataIsInt=item.data(self.DRAWABLE_INDEX).toInt() 
     drawable=None 
     if dataIsInt: 
      drawable=self.drawables[dataAsInt] 
      item.setPen(markupColors[drawable.source]) 
     item.paint(painter, option, None) 

méthode de la vue est remplacé par "singe-patching", comme ceci:

self.ui.imageArea.drawItems=self.drawer.drawItems 

ci-dessus La méthode est self.drawer.drawItems dans la dernière instruction.

Des idées pour lesquelles cela se produit?

Répondre

0

Je pense que cela provoque le problème:

item.setPen(markupColors[drawable.source]) 

Si vous jetez un coup d'oeil au code source:

void QAbstractGraphicsShapeItem::setPen(const QPen &pen) 
{ 
    Q_D(QAbstractGraphicsShapeItem); 
    prepareGeometryChange(); 
    d->pen = pen; 
    d->boundingRect = QRectF(); 
    update(); 
} 

Il appelle la mise à jour() chaque stylo temps est réglé.

+0

Ah, excellent. Je vous remercie! Je l'ai changé à 'painter.setPen' à la place, mais il ne change pas de couleur? Je vais devoir essayer de mettre le stylo une fois à la place. – carlpett