In PyQT, wie kann ich kleine "Knoten" an bestimmten Punkten plotten und sie mit Kanten verbinden? Alle PyQT-Tutorials, die ich finde, sind "plot a button! Plot a checkbox!"Wie kann ich in PyQT Knoten und Kanten zeichnen?
Huge Dank im Voraus
In PyQT, wie kann ich kleine "Knoten" an bestimmten Punkten plotten und sie mit Kanten verbinden? Alle PyQT-Tutorials, die ich finde, sind "plot a button! Plot a checkbox!"Wie kann ich in PyQT Knoten und Kanten zeichnen?
Huge Dank im Voraus
Wenn Sie mit den Objekten in der Handlung angezeigt zu interagieren zu können, werden Sie besser dran mit einem QGraphicsScene sein. Es behandelt Zoomen und Schwenken und kann andere QGraphicsItem Objekte enthalten, die mit ihren eigenen Interaktionen umgehen können.
Es ist sehr einfach zu bedienen, aber es ist ein wenig Overhead beteiligt, vor allem, wenn Sie vorhaben, Tausende von Objekten zu machen.
Sie können ein PyQt Tutorial here finden. Diese und die API-Dokumentation sollten Sie zum Einstieg bringen.
Es war ein Schmerz, eine gute Erklärung dafür zu finden (wie schon Ende 2014), und da diese Frage genau nach dem was ich suche, werde ich eine Transkription (von C++ nach Python) posten) von dem, was ich in this post gefunden habe.
Der folgende Code ist, und hier ist die Begründung:
QGrahpicsItem
, QPainterPath
und QPainterPath.Element
sind die Klassen, die Sie für suchen. Insbesondere implementiert QPainterPath die Vektorfunktionalität, die Sie in Anwendungen wie CorelDraw, Adobe Illustrator oder Inkscape erwarten.QGraphicsEllipseItem
(zum Rendern von Knoten) und QGraphicsPathItem
(zum Rendern des Pfads selbst), die von QGraphicsItem
erben.Path
Konstruktor iteriert über die QPainterPath
Elemente und erstellt Node
Elemente für jede; Jeder von ihnen wiederum sendet Aktualisierungen an das übergeordnete Path-Objekt, das seine path
-Eigenschaft entsprechend aktualisiert.#!/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_()
Dieser Code hat mir in letzter Zeit so viel geholfen! Vielen Dank! Ich versuche auch, eine Funktion in der Klasse Node - mousePressEvent/middle click zu plotten, um einen Kontrollpunkt zum Pfad lineTo hinzuzufügen.() So dass von Punkt A> BI kann Punkt C in der Mitte hinzufügen .. so kann ich ein " L "shape ... Bedeutung> A/B oben links/rechts unten und C ist Ecke ... Aber ich bin mir nicht sicher, ob es der richtige Weg ist, da ich nicht nur rote Linie zeichnen nur Kreise, wenn ich drücke .. Irgendwelche Hinweise wie ich es machen kann? Vielen Dank! – Dariusz
@Dariusz Ich bin sicher, es gibt eine Art von "Mouseover" Event oder Flag in Qt, aber ich erinnere mich nicht an seinen Namen, egal welche Klasse es hat. Ich würde anfangen, das in 'QGraphicsItem' zu suchen. – heltonbiker
@Dariusz, tatsächlich habe ich sie gefunden, sie sind die 'HoverEnterEvent' und' HoverLeaveEvent', gefunden [hier] (http://doc.qt.io/qt-4.8/qgraphicsitem.html). – heltonbiker
Sie wissen nicht, über das Tutorial, das Sie verknüpft haben. Ich bekomme einen Segmentierungsfehler, wenn ich die PyQt-Anwendung schließe. – rbaleksandar
Das Tutorial ist von 2008, einige Dinge haben sich in der Zwischenzeit vielleicht geändert. Segfault-on-close ist normalerweise ein Zeichen dafür, dass etwas mit der Lebensdauer/Konfiguration Ihrer grundlegenden QT-Klassen (QApplication, QMainWindow usw.) nicht stimmt. Wenn Sie Tutorials für Ihre PyQt-Version ausführen können, sollten Sie in der Lage sein, die notwendigen Elemente einzubinden, damit QGraphicsScene funktioniert. – drxzcl
Ich habe meine Probleme behoben. Aber ja, Version ist alt. – rbaleksandar