将 qwtPlotZoomer 选择限制为 canvas 个边界

limit qwtPlotZoomer selection to canvas boundaries

qwtPlotZoomer 的默认行为似乎是您可以 select 一个超出轴比例边界和 canvas 大小的矩形,如 realtime 示例:

我想限制 selection 的边缘等于 canvas 或 zoomRect 边界。有什么简单的方法可以做到这一点吗?

编辑:

根据 Uwe 的建议,我重载了 move() 函数如下,这样可以防止选择器的矩形被绘制到屏幕外。

void QZoomer::move(const QPoint& pos)
{
    // bound the picker selection to the zoom base so you can't zoom off screen
    QPoint boundedPos = pos;

    if (boundedPos.x() > plot()->canvas()->contentsRect().right())  boundedPos.setX(plot()->canvas()->contentsRect().right());
    if (boundedPos.x() < plot()->canvas()->contentsRect().left())   boundedPos.setX(plot()->canvas()->contentsRect().left());
    if (boundedPos.y() < plot()->canvas()->contentsRect().top())    boundedPos.setY(plot()->canvas()->contentsRect().top());
    if (boundedPos.y() > plot()->canvas()->contentsRect().bottom()) boundedPos.setY(plot()->canvas()->contentsRect().bottom());

    QwtPlotPicker::move(boundedPos);
}

另一种方法是覆盖缩放功能并将 rect 绑定到 zoomBase。这将实际缩放限制为缩放基础,但仍将选择器绘制到线条之外。

void Zoomer::zoom(const QRectF& rect)
{
    // bound the zooming rect to the zoomBase dimensions
    QRectF boundedRect = rect & zoomBase(); 
    QwtPlotZoomer::zoom(boundedRect);
}

您可以重载 move() 方法并将位置绑定到 canvas 的 contentsRect() 那里(或者更好地使用 pickArea - 通常是相同的)。