2016-08-03 15 views
0

Was wäre der richtige Ansatz, um Scribble wie Zeichnen in QT zu implementieren, aber auch einige der gezeichneten Pfade zu löschen?Wie kann man Zeichnungen mit der Möglichkeit implementieren, Pfade in QT zu löschen?

Ich habe einige Beispiele gesehen, in denen die Zeichnung implementiert wird, indem Ellipsen als Punkte zu Bildern hinzugefügt werden (QImage), aber soweit ich weiß, sind Sie nicht in der Lage, gezeichnete Linien zu löschen. Eine Sache, über die ich nachgedacht habe, ist die Implementierung von QPainterPaths. Wenn Sie die Maustaste loslassen, starten Sie einen neuen Pfad, fügen Sie beim Bewegen der Maus Punkte zum Pfad an der Mausposition hinzu, und beenden Sie diesen Pfad bei der Mausfreigabe. Auf dem Zeichenereignis würde ich eine Reihe von QPainterPaths durchlaufen und jeden von ihnen zeichnen. Beim Löschen würde ich jeden QPainterPath im Array durchlaufen und prüfen, ob ein Punkt kollidiert, falls ja, entferne den gesamten Pfad vom Array und lösche ihn effektiv.

Ist das ein gültiger Ansatz oder ist es etwas, das mit QPaths nicht erreicht werden kann?

Gibt es einen besseren, intelligenteren Weg, es zu tun?

+0

Sorry, aber Ihre Frage ist zu breit und nicht eine gute Passform für SO. –

Antwort

0

Dies scheint in der Tat eine gültige oder zumindest einem Arbeitsansatz zu sein, auch wenn meine Frage ein wenig breit, schließlich jemand die Antwort nützlich finden werden:

/* 
* QList<QGraphicsPathItem *> mList; 
* bool mErase; 
* QPainterPath * mCurrentPath; 
* QPainterPathStroker mStroker; 
*/ 

void ScribbleArea::mousePressEvent (QGraphicsSceneMouseEvent* event) 
{ 
    if(!mErase) 
    { 
     mCurrentPath = new QPainterPath(); 
     mCurrentPath->moveTo(event->lastScenePos()); 
     mList.append(addPath(mStroker.createStroke(*mCurrentPath), QPen(Qt::red), QBrush(Qt::red))); 
    } 
    QGraphicsScene::mousePressEvent(event); 
} 

void ScribbleArea::mouseMoveEvent (QGraphicsSceneMouseEvent* event) 
{ 
     if(!mErase) 
     { 
      mCurrentPath->lineTo(event->lastScenePos()); 
      mList[mList.count()-1]->setPath(mStroker.createStroke(*mCurrentPath)); 
     } 
     else 
     { 
      for(int i=0; i < mList.count(); i++) 
      { 
       if(mList[i]->isUnderMouse()) 
       { 
        removeItem(mList[i]); 
        delete mList[i]; 
        mList.removeAt(i); 
       } 
      } 
     }  
     QGraphicsScene::mouseMoveEvent(event); 
} 

Das sind die beiden wichtigsten Funktionen, Auf mousePressEvent starte ich einen neuen Pfad und verschiebe ihn an die aktuelle Mausposition. Als nächstes füge ich den Pfad zu QGraphicsScene hinzu, um einen Zeiger auf QGraphicsPathItem zu erhalten, den ich in der mouseMoveEvent Funktion benutzen werde.

In der mouseMoveEvent-Funktion, zuerst überprüfe ich, ob wir gerade löschen oder zeichnen. Im Falle des Zeichnens füge ich eine Linie aus dem letzten Pfad des Pfades zur aktuellen Mausposition hinzu und füge den Pfad erneut zu QGraphicsScene hinzu, sonst werden die neuen Linien nicht angezeigt (vielleicht gibt es einen besseren Weg, ich bin offen für Verbesserungen), das ist es zum Zeichnen. Im Fall, dass wir löschen, gehe ich durch eine Liste aller Pfade und überprüfe, ob einer der Pfade momentan unter der Maus liegt, falls ja, entferne ihn.

Dies ist derzeit nur ein Entwurf, weitere Verbesserungen zu kommen.

Einige ehrfürchtige Beispiel für die Zeichnung/Geschreibsel:

Some awesome example of the drawing