带箭头的 QwtPlotCurve / QwtPainter

QwtPlotCurve with arrow / QwtPainter

我想画一个 QwtCurve,在曲线的末端有箭头。经过很长时间的搜索,我没有找到一个简单的方法来做到这一点。所以我想创建一个 class QwtPlotArrow 继承自 QwtPlotCurve.

我覆盖了 QwtPlotCurvedrawCurve() 函数,并尝试使用 QwtPainter::drawLine() 函数在我的绘图上画一条线。我这样做是这样的:

QwtPainter::drawLine(painter, 2, 2, -2, -2);

在覆盖函数结束时我调用

QwtPlotCurve::drawCurve(painter, style, xMap, yMap, canvasRect, from, to);

执行QwtPlotCurvedrawCurve()函数。

大多数事情都运行良好。调用了QwtPlotArrowdrawCurve()函数,之后甚至执行了QwtPlotCurvedrawCurve()函数。但是图上没有画出 (2,2) 到 (-2,-2) 的线形。

这意味着,我在执行此命令时出错了:

QwtPainter::drawLine(painter, 2, 2, -2, -2);

此命令不会绘制线条到绘图。即使在 QwtPlotCurve 的源代码中,我也找不到线条是如何绘制的。对我来说,上面的命令看起来是正确的。

我做错了什么?

我不确定,但我认为问题在于坐标必须映射到绘图。我仍然不知道如何使用

QwtPainter::drawLine(QPainter, 2, 2, -2, -2);

但你可以用

做到这一点
QwtPainter::drawPolyline()

因此您必须创建一个 QwtPointSeriesData 对象。您可以使用 QwtPointMapper 对象将其映射到绘图。

示例:

void QwtPlotArrow::drawCurve(QPainter *painter, int style, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to) const
{
    QwtPointSeriesData* mySeries = new QwtPointSeriesData();
    mySeries->setSamples(QVector<QPointF>() << QPointF(2, 2) << QPointF(-2, -2);

    QwtPainter::drawPolyline(painter, QwtPointMapper().toPolygonF(xMap, yMap, mySeries, from, to));

    //Don't forget to execute the drawCurve function from QwtPlotCurve
    QwtPlotCurve::drawCurve(painter, style, xMap, yMap, canvasRect, from, to);
}