2010-01-31 9 views

Antwort

3

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.

+0

Sie wissen nicht, über das Tutorial, das Sie verknüpft haben. Ich bekomme einen Segmentierungsfehler, wenn ich die PyQt-Anwendung schließe. – rbaleksandar

+0

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

+0

Ich habe meine Probleme behoben. Aber ja, Version ist alt. – rbaleksandar

3

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:

  1. 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.
  2. Das folgende Beispiel profitiert von den bereits vorhandenen QGraphicsEllipseItem (zum Rendern von Knoten) und QGraphicsPathItem (zum Rendern des Pfads selbst), die von QGraphicsItem erben.
  3. Der 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.
  4. Ich fand viel, viel einfacher, die C++ Qt4 Docs zu studieren, als die etwas weniger strukturierten PyQt Dokumente, die anderswo gefunden wurden. Sobald Sie sich daran gewöhnt haben, gedanklich zwischen C++ und Python zu übersetzen, sind die Dokumente selbst eine leistungsfähige Methode, um zu lernen, wie man jede Klasse verwendet.

#!/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_() 
+0

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

+1

@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

+1

@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

Verwandte Themen