绘制线/擦除部分(Qt / C ++)

时间:2016-11-22 18:36:34

标签: c++ qt

我在Qt中绘制线条时尝试完成简单的擦除功能(不是位图而是真线)。

我是在一个“层”中绘制一条黑线,在另一个“层”中绘制一条读取线。然后我想擦掉一些红线,所以我画了一条白线。但是我希望能够看到一些交叉的黑线。

这是我的情况:

enter image description here

我想完成这样的事情:

enter image description here

我一直在玩创建一个继承自QGraphicsLine的自定义类,并实现paint事件以便能够控制合成模式 - 但我还没有找到正确的解决方案。

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

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

可能有一种方法可以使用合成,但您也可以尝试使用红线的轮廓,并使用QPainterPathStroker。创建一个包含该行的路径,然后使用stroker创建一个轮廓。代码将类似于:

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

你可能需要玩这个以获得你想要的东西。当我第一次开始使用QPainterPathStroker时,我并没有发现它非常直观。