2016-11-22 3 views
0

Ich versuche, beim Zeichnen von Linien in Qt (keine Bitmaps, aber echte Linien) eine einfache Löschfunktion auszuführen.Zeichnungslinie/Teil davon löschen (Qt/C++)

Ich bin z.B. Zeichnen einer schwarzen Linie in einer "Schicht" und einer Leselinie in einer anderen "Schicht". Dann möchte ich etwas von der roten Linie löschen, also male ich eine weiße Linie. Allerdings möchte ich etwas von der schwarzen Linie sehen können, wo sich der Schnittpunkt befindet.

Dies ist meine Situation:

enter image description here

ich so etwas wie dies tun möchten:

enter image description here

Ich spiele um eine Custom Klasse mit der Erstellung, die von einem erbt QGraphicsLine und implementiert das Paint-Event, um die Kompositionsmodi steuern zu können - aber ich habe noch nicht die richtige Lösung gefunden.

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    _scene = new QGraphicsScene(this); 
    ui->graphicsView->setScene(_scene); 

    _blackPen = QPen(Qt::black); 
    _blackPen.setWidth(40); 

    _redPen = QPen(Qt::red);; 
    _redPen.setWidth(40); 

    _eraserPen = QPen(Qt::white); 
    _eraserPen.setWidth(10); 

    _scene->addItem(new CustomLine(0,0,100,100, _blackPen, QPainter::CompositionMode_Source)); 
    _scene->addItem(new CustomLine(0,100,100,100, _redPen, QPainter::CompositionMode_Source)); 
    _scene->addItem(new CustomLine(0,100,100,100, _eraserPen, QPainter::CompositionMode_Source)); 
} 


    #include "customline.h" 
    #include <QPainter> 

    CustomLine::CustomLine(qreal x, qreal y, qreal x2, qreal y2, QPen &pen,  QPainter::CompositionMode mode) 
    { 
    _x = x; 
    _y = y; 
    _x2 = x2; 
    _y2 = y2; 
    _pen = pen; 
    _mode = mode; 
} 

    void CustomLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
    { 
     painter->setPen(_pen); 
     painter->setCompositionMode(_mode); 
     painter->drawLine(_x,_y, _x2, _y2); 
    } 

Irgendwelche Vorschläge?

+0

Anstatt eine Linie zu zeichnen, zeichne ein ungefülltes Rechteck :) –

Antwort

1

Möglicherweise gibt es eine Möglichkeit, dies mit dem Compositing zu tun, aber Sie können auch versuchen, einen Umriss der roten Linie zu verwenden, und dafür verwenden Sie QPainterPathStroker. Erstellen Sie einen Pfad, der die Linie enthält, und erstellen Sie dann mithilfe des Strokers einen Umriss. Der Code wird etwas wie sein:

QPainterPath path; 
path.lineTo (...); 
QPainterPathStroker stroker; 
QPainterPath outline = stroker.createStroke (path).simplified()); 
painter.drawPath (outline); 

Sie müssen wahrscheinlich damit spielen, um zu bekommen, was Sie wollen. Als ich anfing, QPainterPathStroker zu benutzen, fand ich es nicht schrecklich intuitiv.

+0

Richtig, das ist eine Lösung zum Zeichnen einer Kontur, aber leider ist es nicht der Kontureffekt, nach dem ich suche. Ich suche nach einer Methode, bei der ich die "weiße" Linie zeichnen kann, so löscht/verbirgt sie die rote Linie und zeigt die schwarze Linie darunter. –

Verwandte Themen