2017-09-10 30 views
0

此代碼的目的是節點圖表種類UI的。 雙擊創建矩形,右鍵單擊將它們與線條連接起來。如果您繼續使用矩形,則相應的行尾將隨之移動。問題在於線條只會移動前兩個矩形。如果您創建另一對矩形並將其與線連接,則會停止移動。我最近開始學習PySide/PyQt,所以也許我不明白所有的代碼。PySide節點格拉夫連接項

下面是代碼: https://github.com/cyberiRex/irex/blob/master/nodeGraph

+0

找到儘管它缺少驗證,以你的代碼工作的,我得到像加一定的規定,有下列以下'如果event.button()== Qt.RightButton: 如果len(self.selectedItems())== 2:'。在結束我得到如下:http://imgur.com/a/TtEeQ – eyllanesc

+0

是的,但是曲線不會更新。 – Cyberikia

+0

你的意思是什麼曲線,紅線?,請更好地解釋你自己。 – eyllanesc

回答

1

生成該錯誤的代碼是下列之一:

self.selectedItems()[0].linkToItem = item 
self.selectedItems()[1].linkToItem = item 

比方說,一個節點由一個鏈接已經連接到另一個,當另一個鏈接被添加,之前的鏈接被刪除,這就是爲什麼他們斷開連接。

這樣的邏輯將繼續產生類似的錯誤,所以我提出的解決方案是一種新的解決方案的邏輯,用於在下面的例子中這Elastic Nodes Example我基。從你可以作爲理解我解決方案邏輯的基礎,顯然我已經做出了一些變體來滿足你的要求。

在第一部分中我已經取代基類到QGraphicsRectItem和QGraphicsLineItem降低實施。該邏輯基於給予它們連接的每個邊緣2節點,以便在更新時參考節點。此外,每個節點都存儲邊緣列表,以便每次移動節點時都執行更新。下面的代碼實現以上:

class SceneClass(QGraphicsScene): 
    grid = 30 

    def __init__(self, parent=None): 
     QGraphicsScene.__init__(self, QRectF(-1000, -1000, 2000, 2000), parent) 

    def drawBackground(self, painter, rect): 
     painter.fillRect(rect, QColor(30, 30, 30)) 
     left = int(rect.left()) - int((rect.left()) % self.grid) 
     top = int(rect.top()) - int((rect.top()) % self.grid) 
     right = int(rect.right()) 
     bottom = int(rect.bottom()) 
     lines = [] 
     for x in range(left, right, self.grid): 
      lines.append(QLine(x, top, x, bottom)) 
     for y in range(top, bottom, self.grid): 
      lines.append(QLine(left, y, right, y)) 
     painter.setPen(QPen(QColor(50, 50, 50))) 
     painter.drawLines(lines) 

    def mouseDoubleClickEvent(self, event): 
     node = Node() 
     self.addItem(node) 
     node.setPos(event.scenePos()) 
     QGraphicsScene.mouseMoveEvent(self, event) 

    def mousePressEvent(self, event): 
     if event.button() == Qt.RightButton: 
      if len(self.selectedItems()) == 2: 
       edge = Edge(self.selectedItems()[0], self.selectedItems()[1]) 
       self.addItem(edge) 
     QGraphicsScene.mousePressEvent(self, event) 


class Node(QGraphicsRectItem): 
    def __init__(self, rect=QRectF(-75, -15, 150, 30), parent=None): 
     QGraphicsRectItem.__init__(self, rect, parent) 
     self.edges = [] 
     self.setZValue(1) 
     self.setBrush(Qt.darkGray) 
     self.setFlags(QGraphicsItem.ItemIsMovable | 
         QGraphicsItem.ItemIsSelectable | 
         QGraphicsItem.ItemSendsGeometryChanges) 

    def addEdge(self, edge): 
     self.edges.append(edge) 

    def itemChange(self, change, value): 
     if change == QGraphicsItem.ItemSelectedChange: 
      self.setBrush(Qt.green if value else Qt.darkGray) 

     if change == QGraphicsItem.ItemPositionHasChanged: 
      for edge in self.edges: 
       edge.adjust() 

     return QGraphicsItem.itemChange(self, change, value) 


class Edge(QGraphicsLineItem): 
    def __init__(self, source, dest, parent=None): 
     QGraphicsLineItem.__init__(self, parent) 
     self.source = source 
     self.dest = dest 
     self.source.addEdge(self) 
     self.dest.addEdge(self) 
     self.setPen(QPen(Qt.red, 1.75)) 
     self.adjust() 

    def adjust(self): 
     self.prepareGeometryChange() 
     self.setLine(QLineF(self.dest.pos(), self.source.pos())) 

獲得什麼是如下圖所示:

enter image description here

完整的例子可以在下列link