¿Cómo puedo dibujar nodos y aristas en PyQT?

En PyQT, ¿cómo puedo trazar pequeños “Nodos” en puntos determinados y conectarlos con bordes? Todos los tutoriales de PyQT que encuentro son “trazar un botón, trazar una checkbox”

Enormes gracias de antemano

Si desea poder interactuar con los objetos que se muestran en el gráfico, será mejor que utilice un QGraphicsScene . Maneja el zoom y la panorámica y puede contener otros objetos QGraphicsItem que pueden manejar sus propias interacciones.

Es muy fácil de usar, pero implica un poco de sobrecarga, especialmente si planea hacer miles de objetos.

Puedes encontrar un tutorial de PyQt aquí . Esto y los documentos de la API deben comenzar.

Ha sido un dolor encontrar una buena explicación para esto (a partir de finales de 2014 ya), y ya que esta pregunta pregunta exactamente qué estaba buscando, publicaré una transcripción (de C ++ a Python) de lo que busco. Encontrado en este post .

El código está abajo, y aquí está la razón:

  1. QGrahpicsItem , QPainterPath y QPainterPath.Element son las clases que está buscando. Específicamente, QPainterPath implementa el tipo de funcionalidad vectorial que espera en aplicaciones como CorelDraw, Adobe Illustrator o Inkscape.
  2. El siguiente ejemplo se beneficia del QGraphicsEllipseItem preexistente (para nodos de representación) y QGraphicsPathItem (para representar la ruta en sí), que se hereda de QGraphicsItem .
  3. El constructor de Path itera sobre los elementos QPainterPath , creando elementos de Node para cada uno; Cada uno de ellos, a su vez, envía actualizaciones al objeto Ruta principal, que actualiza su propiedad de path consecuencia.
  4. Descubrí que es mucho más fácil estudiar los documentos de C ++ Qt4 que los documentos de PyQt algo menos estructurados que se encuentran en otros lugares. Una vez que te acostumbras a traducir mentalmente entre C ++ y Python, los documentos en sí mismos son una forma poderosa de aprender a usar cada clase.

 #!/usr/bin/env python # coding: utf-8 from PyQt4.QtGui import * from PyQt4.QtCore import * rad = 5 class Node(QGraphicsEllipseItem): def __init__(self, path, index): super(Node, self).__init__(-rad, -rad, 2*rad, 2*rad) self.rad = rad self.path = path self.index = index self.setZValue(1) self.setFlag(QGraphicsItem.ItemIsMovable) self.setFlag(QGraphicsItem.ItemSendsGeometryChanges) self.setBrush(Qt.green) def itemChange(self, change, value): if change == QGraphicsItem.ItemPositionChange: self.path.updateElement(self.index, value.toPointF()) return QGraphicsEllipseItem.itemChange(self, change, value) class Path(QGraphicsPathItem): def __init__(self, path, scene): super(Path, self).__init__(path) for i in xrange(path.elementCount()): node = Node(self, i) node.setPos(QPointF(path.elementAt(i))) scene.addItem(node) self.setPen(QPen(Qt.red, 1.75)) def updateElement(self, index, pos): path.setElementPositionAt(index, pos.x(), pos.y()) self.setPath(path) if __name__ == "__main__": app = QApplication([]) path = QPainterPath() path.moveTo(0,0) path.cubicTo(-30, 70, 35, 115, 100, 100); path.lineTo(200, 100); path.cubicTo(200, 30, 150, -35, 60, -30); scene = QGraphicsScene() scene.addItem(Path(path, scene)) view = QGraphicsView(scene) view.setRenderHint(QPainter.Antialiasing) view.resize(600, 400) view.show() app.exec_()