如何为 QPainterPath 子路径着色不同?

How can I color QPainterPath subpaths differently?

正如标题所暗示的那样,我正在寻找一种方法来为 QPainterPath 的子路径着色,将不同的颜色应用于 QGraphicsPathItem,或者简单地使用 QGradient QPen 沿 PathItem 更改颜色。

最终我试图找到正确的解决方案,这将使我能够明显地绘制一条线,它会根据外部变量改变颜色。

我正在使用 QGraphicsScene 绘制所有内容。

我当前的解决方案是创建多个 QGraphicsPathItems,每个 QGraphicsPathItems 都使用各自的 QPen 着色不同。当我获取数据时,我填充与那些 PathItems 关联的 PainterPath。这给了我需要的彩色线条,但线条明显断开。

我需要能够在颜色更改期间使 QPainterPath 的子路径不可见,或者更改应用于单个 PathItem 的渐变。或者我可能缺少另一种方法。 任何帮助都会很棒。

-编辑:

正如我的问题的解决方案中所述,这就是我目前的绘图方式。再次注意,我使用的是 GraphicsScene。

这就是我想要做的。

如您所见,线条在绘制时会通过外部变量改变颜色。恐怕 Qgradient 可能行不通,因为这条线并不总是直的;颜色需要沿着线条流动。

这是正在发生的事情:

如您所见,红线 (PathItem) 从上次可见的位置跳到新位置。

为了帮助更好地阐明行为,请想象这条线是随着时间的推移绘制的。它开始是红色的,很快一个变量被设置,所绘制的线段的颜色变为橙色。这条线的红色部分保持不变,所以我们可以从历史上看到当时变量的状态。在不同的时间,变量会调整,并且应用于线条新部分的颜色会相应地更新。

线条绘制完成后,我们可以查看它,看看颜色何时发生变化。

我希望这一切都有意义。

您可以使用多个 QPainterPath,每种颜色一个。然后用合适的颜色把它们都涂上。请务必使用 moveTo() 移动当前路径光标而不画线。

void Widget::paintEvent(QPaintEvent *event)
{
    QPainterPath redPath;
    QPainterPath bluePath;
    redPath.moveTo(0,0);
    redPath.lineTo(60,60);
    bluePath.moveTo(60,60);
    bluePath.lineTo(70,20);
    redPath.moveTo(70,20);
    redPath.lineTo(100,100);
    bluePath.moveTo(100,100);
    bluePath.lineTo(160,260);


    QPainter painter(this);
    painter.setRenderHint(QPainter::HighQualityAntialiasing, true);
    painter.setPen(QPen(Qt::red, 4));
    painter.drawPath(redPath);
    painter.setPen(QPen(Qt::blue, 4));
    painter.drawPath(bluePath);

}

如果你觉得对"moveTo"和"lineTo"的调用有点繁重,你可以用一个lineTo(QPointF, QColor)函数封装你自己的class中的所有QPainterPaths当你改变颜色时将处理路径切换。