2016-11-22 149 views
0

在Qt中繪製行時,我嘗試完成一個簡單的擦除功能(不是位圖,而是實際行)。繪圖行/擦除部分(Qt/C++)

我是例如在一個「層」中繪製黑色線,在另一個「層」中繪製讀取線。然後我想抹掉一些紅線,所以我畫了一條白線。但是我希望能夠看到相交處的一些黑線。

這是我的情況:

enter image description here

我要完成這樣的事情:

enter image description here

我一直在創建從繼承的customline類玩弄QGraphicsLine並實現繪畫事件以便能夠控制合成模式 - 但我還沒有找到正確的解決方案。

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); 
    } 

有什麼建議嗎?

+0

而不是繪製一條線,繪製一個未填充的矩形:) –

回答

1

可能有一種方法可以通過合成來實現,但是您也可以嘗試使用紅線的輪廓,並使用QPainterPathStroker來獲取它。創建一個包含該行的路徑,然後使用stroker爲其創建一個輪廓。代碼將是這樣的:

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

你可能需要玩這個來得到你想要的。當我第一次開始使用QPainterPathStroker時,我並沒有覺得它非常直觀。

+0

更正這是繪製輪廓的解決方案,但不幸的是它不是我正在搜索的輪廓效果。我正在尋找一種可以繪製「白線」的方法,因此可以擦除/隱藏紅線,並顯示下方的黑線。 –