使用QGraphicsPathItem 绘制样条线。然后,使用QPainterPath::cubicTo 方法创建点之间的连接。
您需要计算控制点以在两点之间绘制平滑的贝塞尔曲线。
您可以找到一堆基于二次贝塞尔曲线的更好的库,但下面是一个使用 Qt 类型和简单方法来理解如何获取控制点的快速示例:
QPair<QPointF, QPointF> controlPoints(QPointF const& p0, QPointF const& p1, QPointF const& p2, qreal t=0.25)
{
QPair<QPointF, QPointF> pair;
qreal d01 = qSqrt( ( p1.x() - p0.x() ) * ( p1.x() - p0.x() ) + ( p1.y() - p0.y() ) * ( p1.y() - p0.y() ) );
qreal d12 = qSqrt( ( p2.x() - p1.x() ) * ( p2.x() - p1.x() ) + ( p2.y() - p1.y() ) * ( p2.y() - p1.y() ) );
qreal fa = t * d01 / ( d01 + d12 );
qreal fb = t * d12 / ( d01 + d12 );
qreal c1x = p1.x() - fa * ( p2.x() - p0.x() );
qreal c1y = p1.y() - fa * ( p2.y() - p0.y() );
qreal c2x = p1.x() + fb * ( p2.x() - p0.x() );
qreal c2y = p1.y() + fb * ( p2.y() - p0.y() );
pair.first = QPointF( c1x, c1y );
pair.second = QPointF( c2x, c2y );
return pair;
}
然后,浏览您的积分列表以创建QPainterPath:
QPainterPath BackgroundBuilder::buildPath(QList<QPointF> const& points)
{
QPainterPath pth;
QPair<QPointF, QPointF> pair = controlPoints(points.at(0), points.at(1), points.at(2));
QPointF p0 = pair.second;
pth.moveTo(0, 0);
pth.lineTo(p0);
for (int i = 2; i != points.count() - 1; ++i)
{
QPair<QPointF, QPointF> pair = controlPoints( points.at(i - 1), points.at(i), points.at(i + 1));
pth.cubicTo( p0, pair.first, points.at( i ) );
p0 = pair.second;
}
return pth;
}
您可能需要将您的 MeasurePoint 转换为 QPointF 以保持此代码通用:
QList<QPointF> points;
QList<MeasurePoint*> measures = ...;
for (MeasurePoint* measure: measures)
{
points << QPointF(measure.xPos, measure.yPos);
}