如何为 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当你改变颜色时将处理路径切换。
正如标题所暗示的那样,我正在寻找一种方法来为 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当你改变颜色时将处理路径切换。