lundi 22 juillet 2013

PyQt QGraphicsView la base pour un node graph

   
Evolution de la chose : http://unblogdecolin.blogspot.fr/2016/11/le-retour-du-node-graph-en-pyside.html

Ici je vais vous présenter une base pour faire un "node graph" ou viewport 2D... mon exemple est très simple il y a seulement deux éllipses en guise de "nodes",pour l'instant on regarde juste le paramétrage de base de notre QGraphicsView qui est notre support de base, peut être un jour je vous représenterai un ticket pour les nodes et leurs connections.


Un QGraphicsView avec une grille, deux items sélectionnable et bougeable, un lasso de sélection et un alt-drag pour bouger dans la vue.


 
from PyQt4 import QtGui, QtCore


class View(QtGui.QGraphicsView):
    def __init__(self):
        QtGui.QGraphicsView.__init__(self)
        self.resize(500, 500)

#on place le point de pivot des transformation au niveau du pointeur
       self.setTransformationAnchor(QtGui.QGraphicsView.AnchorUnderMouse)
       self.setResizeAnchor(QtGui.QGraphicsView.AnchorViewCenter)
#on cache les scrollBar
       self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
       self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)  
        
#active l’antialiasing
        self.setRenderHint(QtGui.QPainter.Antialiasing)
        
#creation du scene qui contient les items et sera dans la QView
        self.scene = QtGui.QGraphicsScene()
        self.scene.setSceneRect(-50000, -50000, 100000, 100000)

        
#Ajout d'une grille en fond
        self.setBackgroundBrush(QtGui.QBrush(QtGui.QColor(60,60,60), QtCore.Qt.CrossPattern))
  
#creation de deux elipse simple a la scene, selectable et movable
        ep = self.scene.addEllipse (20, 40, 50, 50)
        ep.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
        ep.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)
 
        epS = self.scene.addEllipse (20, 120, 50, 50)
        epS.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
        epS.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)
        
#parametrage du drag mode  rubber …. permet davoir un lasso rectangulaire de selection
        self.setDragMode(QtGui.QGraphicsView.RubberBandDrag)
        self.setRubberBandSelectionMode(QtCore.Qt.IntersectsItemShape)
        self.setScene(self.scene)
        
        
#alt drag scroll bar, permet de se deplacer dans le graph grace a la touche alt.       
    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Alt:
            self.setDragMode(QtGui.QGraphicsView.ScrollHandDrag)
    def keyReleaseEvent(self, event):
        if event.key() == QtCore.Qt.Key_Alt:
            self.setDragMode(QtGui.QGraphicsView.RubberBandDrag)
            
        
d = View()
d.show()