0

我有一个问题,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绘制两次所需曲线的不良边缘 - 每个方向一次。

我在这里做错了什么?

4

1 回答 1

2

你做错了什么是你正在使用一种有效地填充路径的方法,产生一个形状。

您应该改用该void QPainter::strokePath(const QPainterPath & path, const QPen & pen)方法,它只会绘制路径笔划。

诚然,“绘制路径”听起来确实有点模棱两可。QBrush期望作为艺术画笔工作会变得更糟。我猜想出这些名字的是程序员,而不是艺术家。

编辑:如果您想要获得的是笔划/轮廓的“形状”或几何形状,即由 绘制的QPainter::strokePath(),您可以生成它,QPainterPathStroker::createStroke(const QPainterPath & path)然后使用QPainter::drawPath()生成的路径,这将产生与QPainter::strokePath().

编辑 2:我终于明白了你的意图,哈哈。实际上可以通过使用子路径在单个画家路径中拥有“单独/单独的曲线”,即:

    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()似乎也有效:

    QPainter p(this);
    QPainterPath p1(QPointF(10,10));
    p1.quadTo(QPointF(100,50), QPointF(100,200));
    p1.moveTo(50, 10);
    p1.quadTo(QPointF(150,50), QPointF(150,200));
    p.strokePath(p1, QPen(Qt::black));

还有 tadaaa,一条路径中有多个单独的曲线:

在此处输入图像描述

似乎不仅视觉输出相同,两种方法也具有相同的数字路径元素。然而,正如评论中提到的,两条开放曲线的这些解决方案都没有真正产生形状。

于 2015-10-10T19:21:48.383 回答