QPainterPath 在终点关闭曲线子路径

QPainterPath closing a curve subpath at end point

我对 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 绘制了两次 - 每个方向各一次。

我做错了什么?

你做错的是你使用了一种有效填充路径、生成形状的方法。

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

诚然,"draw path" 听起来确实有点模棱两可。更糟糕的是期望 QBrush 作为艺术画笔工作。我猜想出这些名字的是程序员,而不是艺术家。

编辑:如果你想要得到的是 "shape" 或 stroke/outline 的几何图形,即 QPainter::strokePath() 绘制的内容,你可以使用 [=15= 生成它] 然后将 QPainter::drawPath() 与生成的路径一起使用,这将产生与 QPainter::strokePath().

相同的结果

编辑 2:我终于明白了你的意图,哈哈。实际上可以在单个画家路径中使用 "separate/individual curves",或者通过使用子路径,即:

    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,一条路径中有多个单独的曲线:

似乎不​​仅视觉输出相同,两种方法的路径元素数量也相同。然而,正如评论中提到的,none 两条开放曲线的这些解决方案实际上产生了一个形状。