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