QwtPlotZoomer源码解读

QwtPlotZoomer是Qt库中的一个类,用于实现绘图窗体的缩放功能。它可以响应鼠标和键盘输入来选择矩形区域进行缩放,并维护一个缩放存储栈。用户可以通过鼠标或键盘事件遍历这个栈,实现缩放历史的撤销和重做。缩放器允许设置最大堆栈深度和最小缩放尺寸,确保了灵活的缩放操作。此外,它还提供信号来通知缩放操作的变化。

QwtPlotZoomer对一个绘图窗体提供了缩放存储栈

QwtPlotZoomer从用户的输入(鼠标或键盘)选择矩形,并把他们转换到绘图坐标系上,然后依据选中的矩形范围调整坐标轴。

选中区域由橡皮筋(可自由拉伸)所支持,还可以选择显示当前鼠标位置的坐标。

缩放可以尽可能多的重复,它仅受maxStackDepth()或minZoomSize()的限制。每一个矩形都被放在一个堆栈里。

如何选择矩形的默认设置是QwtPickerDragRectMachine,具有以下属性:

QwtEventPattern::MouseSelect1:缩放矩形的第一个点是鼠标按下处的坐标,第二个点是鼠标释放处的坐标
QwtEventPattern::KeySelect1:缩放矩形的第一个点是按下的第一个键,第二个点是按下的第二个键
QwtEventPattern::KeyAbort:在选择第一个点的状态下放弃选择

要遍历缩放堆栈,使用如下属性:

QwtEventPattern :: MouseSelect3,QwtEventPattern :: KeyUndo:向堆栈底部方向遍历
QwtEventPattern :: MouseSelect6,QwtEventPattern :: KeyRedo:向堆栈顶部方向遍历
QwtEventPattern :: MouseSelect2,QwtEventPattern :: KeyHome:直接回到堆栈底部

#ifndef QWT_PLOT_ZOOMER_H
#define QWT_PLOT_ZOOMER_H

#include "qwt_global.h"
#include "qwt_plot_picker.h"
#include <qstack.h>

/***************************************************
缩放器设置为启用的画布所在QwtPlot的x轴和y轴。 如果x轴未启用,则将选择器设置为QwtPlot::xBottom。 如果y轴未启用,则将其设置为QwtPlot::yLeft。
缩放器使用QwtPickerDragRectMachine初始化,跟踪器模式设置为QwtPicker::ActiveOnly,橡皮筋设置为QwtPicker::RectRubberBand
***************************************************/

class QWT_EXPORT QwtPlotZoomer: public QwtPlotPicker
{
    Q_OBJECT
public:
    //在画布上创建一个缩放器
    explicit QwtPlotZoomer( QWidget *, bool doReplot = true );
    explicit QwtPlotZoomer( int xAxis, int yAxis,
                            QWidget *, bool doReplot = true );
	
    virtual ~QwtPlotZoomer();

    //以scaleRect()为基础重新初始化缩放堆栈
    virtual void setZoomBase( bool doReplot = true );
    //设置缩放器的初始尺寸
    //base与当前scaleRect()结合在一起,并且缩放堆栈重新初始化为base。 图被缩放到scaleRect()
    virtual void setZoomBase( const QRectF & );

    //返回缩放堆栈底部矩形
    QRectF zoomBase() const;
    //返回缩放堆栈当前位置处的矩形
    QRectF zoomRect() const;

    //设置缩放器到指定的轴上
    virtual void setAxis( int xAxis, int yAxis );

    //将递归缩放操作的数量限制为深度
    //深度值=-1则缩放为无限制,深度值=0则禁用缩放。 如果当前缩放矩形超过深度,则图不缩放
    void setMaxStackDepth( int );
    //返回缩放堆栈的最大深度
    int maxStackDepth() const;

    //返回缩放堆栈
    const QStack<QRectF> &zoomStack() const;
    //分配缩放堆栈
    void setZoomStack( const QStack<QRectF> &,
        int zoomRectIndex = -1 );

    //返回缩放堆栈当前位置处的下标
    uint zoomRectIndex() const;

public Q_SLOTS:
    //移动当前的缩放矩形,x、y为偏移值
    void moveBy( double x, double y );
    //移动当前的缩放矩形到指定坐标
    virtual void moveTo( const QPointF & );
	
    //清除缩放堆栈当前位置上的所有矩形,并将标准化的矩形放在上面
    //放大
    virtual void zoom( const QRectF & );
    //在缩放堆栈上激活一个相对于当前位置有一定偏移的矩形,偏移值为负则缩小,正则放大,0则缩小为缩放基准
    //放大或缩小
    virtual void zoom( int up );

Q_SIGNALS:
    //当图被放大或缩小时,发送zoomRect()
    void zoomed( const QRectF &rect );

protected:
    //将zoomRect()调整到观察视图上
    virtual void rescale();
	
    //将缩放限制为最小矩形
    virtual QSizeF minZoomSize() const;
	
    //默认为:鼠标中键缩小,右键返回缩放基准
    //改变缩放堆栈的当前位置,但是不删除缩放堆栈内的任何矩形
    virtual void widgetMouseReleaseEvent( QMouseEvent * );
    //默认为:+键放大,-键缩小,Esc键返回多发基准
    //改变缩放堆栈的当前位置,但是不删除缩放堆栈内的任何矩形
    virtual void widgetKeyPressEvent( QKeyEvent * );

    //当栈深度太深或者缩放矩形是最小缩放尺寸,拒绝选择
    virtual void begin();
    //将选定的矩形展开为minZoomSize()并放大(如果接受)
    virtual bool end( bool ok = true );
    //拒绝高度或宽度<2的矩形,否则将所选矩形展开为最小尺寸11x11并接受
    //检查并调正选定矩形
    virtual bool accept( QPolygon & ) const;

private:
    //初始化缩放器
    void init( bool doReplot );

    class PrivateData; //嵌套类,封装数据 
    PrivateData *d_data;
};

#endif

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值