2017-02-03 1 views
0

Ich benutze PyQt5. Ich mache ein Roboterprogramm, das sich in einem Labyrinth bewegt. Dafür verwende ich QGraphicsScene. Ich füge Objekte wie QRect hinzu, um Roboter darzustellen. Der Hintergrund wird über SetBackgroundBrush gesetzt und von einem PNG-Bild geladen (schwarz repräsentiert unpassable Gelände): this is how it looksQT5 QgraphicsScene: Wie zeichne ich auf Grund Pixel um Pixel

def update_background(self): 
    qim = QImage(self.model.map.shape[1],self.model.map.shape[0], QImage.Format_RGB32) 
    for x in range(0, self.model.map.shape[1]): 
     for y in range(0, self.model.map.shape[0]): 
      qim.setPixel(x ,y, qRgb(self.model.map[y,x],self.model.map[y,x],self.model.map[y,x])) 
    pix = QPixmap(qim) 
    self.scene.setBackgroundBrush(QBrush(pix)) 

Was ich jetzt tun möchte, ist die Arbeit eines Wegfindung Algorithmus sichtbar zu machen (I A * verwenden jetzt). Wie eine rote Linie, die den Roboter über Hindernisse mit seinem Ziel verbindet. Diese Zeile wird als eine Liste von (X, Y) -Koordinaten gespeichert. Ich wollte über die Liste iterieren und Pixel für Pixel auf die Szene malen. Allerdings weiß ich nicht, wie das geht - es gibt keine "DrawPixel" -Methode. Natürlich kann ich hundert kleine Rechtecke von 1x1 Größe hinzufügen. Allerdings muss ich sie neu zeichnen, wenn sich die Route ändert.

Ich dachte darüber nach, ein Bild mit Pfaden zu erstellen und es in den FOREground zu platzieren und dann hinzuzufügen. Ich kann jedoch keinen transparenten Vordergrund machen. Es war kein Problem mit Hintergrund (weil es in der Rückseite ist). Ich dachte mit theis-Funktion: http://doc.qt.io/qt-5/qpixmap.html#setAlphaChannel

Aber es ist veraltet. Es bezieht sich auf QPainter. Ich weiß nicht, was QPainter ist und ich bin mir nicht sicher, ob ich überhaupt in die richtige Richtung gehe.

Bitte geben Sie einen Rat!

Also, die Frage ist, was ist die richtige und effiziente Möglichkeit zum Zeichnen von Routen von Robotern gebaut?

RobotPathItem(QGraphicsItem): 
def __init__(self, path): 
    super().__init__() 
    qpath = [] 
    for xy in path: 
     qpath.append(QPoint(xy[0],xy[1])) 
    self.path = QPolygon(qpath) 
    if path: 
     print(path[0]) 

def paint(self, painter, option, qwidget = None): 
    painter.drawPoints(self.path) 
def boundingRect(self): 
    return QRectF(0,0,520,520) 

Antwort

2

Es gibt keinen drawPixel ist, aber QPainter hat eine drawPoint oder drawPoints (was viel effizienter in diesem Fall wäre, glaube ich). Sie müssen ein benutzerdefiniertes Grafikelement erstellen, das Ihre Punkteliste enthält, und es durchläuft die Liste der QPointF-Werte und zeichnet sie. Wenn Sie der Liste Punkte hinzufügen, müssen Sie das Begrenzungsrechteck neu berechnen. Zum Beispiel, wenn Sie eine RobotPathItem haben (abgeleitet von QGraphicsItem), Ihre Farbe Methode könnte in etwa so aussehen:

RobotPathItem::paint (QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    QPen pen; 
    // ... set up your pen color, etc., here 
    painter->setPen (pen); 
    painter->drawPoints (points, points.count()); 
} 

Dies wird unter der Annahme, dass „Punkte“ a QList oder QVector von QPointF ist.

+0

Es funktioniert irgendwie, aber nicht vollständig: Ich muss den Pfad aktualisieren, also habe ich zwei Möglichkeiten ausprobiert: 1) jeden Schritt, alten Pfad entfernen und neu malen. Dies funktioniert nicht und erzeugt den Fehler "0-Item nicht entfernen", und alte Pfade werden nicht gelöscht. Die Szene beginnt immer mehr Objekte zu enthalten, sie "verklumpen". 2) Ich erstelle ein Element, nehme einen Zeiger darauf und ändere dann, was dieser Zeiger enthält, indem ich einen neuen Pfad erstelle und ihn dort platziere. Dies führt nur nicht zum Neuzeichnen, der Pfad bleibt der gleiche wie am Anfang gezeichnet. – user2980475

+0

Bei weiterer Überprüfung stellt sich heraus, dass sich meine QGraphicItems selbst löschen. Ich weiss nicht, was falsch ist. Hier formulierte ich die neue Frage (diese ist klar): http://stackoverflow.com/questions/42040974/custom-qgraphicsitem-deletes-itself – user2980475