我遇到QPainterPath
的问题,因为当我这样做时:
QPainterPath path(start);
path.quadTo(control, end);
QPainter painter;
painter.setBrush(Qt::black);
painter.drawPath(path);
它也将曲线下方的区域绘制为黑色。使用QPainterPath::closeSubpath()
或QPainterPath::moveTo(start)
会有所帮助。唯一有帮助的就是将曲线拉回到开头,这是愚蠢的,并且看起来很糟糕的抗锯齿。
但这不仅仅是一个视觉问题。我对QGraphicsItem :: shape()使用相同的代码,它实际上导致项目的形状包括曲线下方的区域,这是不可取的。
当前(使用以上代码)
渴望(使用QPainerPath::quadTo(control, start)
制作)
注意由于QPainter
绘制两次所需曲线的坏边缘 - 从每个方向拉出一次。
我在这里做错了什么?
答案 0 :(得分:2)
你做错了是你正在使用一种有效填充路径,产生形状的方法。
您应该使用void QPainter::strokePath(const QPainterPath & path, const QPen & pen)
方法,而只会绘制路径描边。
当然,“绘制路径”确实听起来有些含糊不清。期待QBrush
作为一种艺术画笔更加糟糕。我想是程序员想出了这些名字,而不是艺术家。
编辑:如果你想得到的是笔画/轮廓的“形状”或几何形状,即QPainter::strokePath()
绘制的内容,你可以使用QPainterPathStroker::createStroke(const QPainterPath & path)
生成它,然后使用{{ 1}}使用生成的路径,这将产生与QPainter::drawPath()
相同的结果。
编辑2:我终于得到了你的意图LOL。实际上,可以通过使用子路径在单个画家路径中具有“单独/单独的曲线”,即:
QPainter::strokePath()
简单地 QPainter p(this);
QPainterPath p1(QPointF(10,10)), p2(QPointF(50,10)), p3;
p1.quadTo(QPointF(100,50), QPointF(100,200));
p2.quadTo(QPointF(150,50), QPointF(150,200));
p3.addPath(p1);
p3.addPath(p2);
p.strokePath(p3, QPen(Qt::black));
似乎也有效:
moveTo()
并且tadaaa,在一条路径中有多条单独的曲线:
似乎不仅视觉输出是相同的,两种方法也具有相同的路径元素数。然而,正如评论中所提到的,两条开放曲线的解决方案实际上都没有产生形状。