我在Qt中绘制线条时尝试完成简单的擦除功能(不是位图而是真线)。
我是在一个“层”中绘制一条黑线,在另一个“层”中绘制一条读取线。然后我想擦掉一些红线,所以我画了一条白线。但是我希望能够看到一些交叉的黑线。
这是我的情况:
我想完成这样的事情:
我一直在玩创建一个继承自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);
}
有什么建议吗?
答案 0 :(得分:1)
可能有一种方法可以使用合成,但您也可以尝试使用红线的轮廓,并使用QPainterPathStroker。创建一个包含该行的路径,然后使用stroker创建一个轮廓。代码将类似于:
QPainterPath path;
path.lineTo (...);
QPainterPathStroker stroker;
QPainterPath outline = stroker.createStroke (path).simplified ());
painter.drawPath (outline);
你可能需要玩这个以获得你想要的东西。当我第一次开始使用QPainterPathStroker时,我并没有发现它非常直观。