需要用到QwtPlotRescaler类,用法如下:

QwtPlotRescaler *plotRescaler = new QwtPlotRescaler(canvas, yLeft, QwtPlotRescaler::Fitting ); 

plotRescaler->setExpandingDirection(QwtPlotRescaler::ExpandBoth);

其构造函数可以设置参考坐标轴,及其缩放动作,默认其他轴与参考轴的比例为1.0。setExpandingDirection函数可以指定在固定好参考轴后,另一轴拉伸时的模式,QwtPlotRescaler::ExpandBoth参数是指向两边扩展。

在找到这个类前,我有一个手动写法,原理是将QwtPlotZoomer的zoomed(const QRectF &)信号与在它所在的QwtPlot类中编写的槽相连,并重写QwtPlot类中的resizeEvent事件:

void TrackPlot::zoomedSlot(const QRectF &rectF)
{
QPointF centerPoint = rectF.center(); double Ratio = rectF.width() / rectF.height();
double hvRatio = double(canvas()->width()) / double(canvas()->height()); if(Ratio > )
{
double scaleFactor = hvRatio / Ratio > ? hvRatio / Ratio : ; setAxisScale(xBottom, centerPoint.x() - scaleFactor * rectF.width() / 2.0,
centerPoint.x() + scaleFactor * rectF.width() / 2.0);
double step = axisStepSize(xBottom);
setAxisScale(yLeft, centerPoint.y() - scaleFactor * rectF.width() / (2.0 * hvRatio),
scaleFactor * centerPoint.y() + scaleFactor * rectF.width() / (2.0 * hvRatio), step);
}
else
{
double scaleFactor = Ratio / hvRatio > ? Ratio / hvRatio : ; setAxisScale(yLeft, centerPoint.y() - scaleFactor * rectF.height() / 2.0,
centerPoint.y() + scaleFactor * rectF.height() / 2.0);
double step = axisStepSize(yLeft);
setAxisScale(xBottom, centerPoint.x() - scaleFactor * rectF.height() * hvRatio / 2.0,
centerPoint.x() + scaleFactor * rectF.height() * hvRatio / 2.0, step);
} replot();
} void TrackPlot::resizeEvent(QResizeEvent *ev)
{
QwtPlot::resizeEvent(ev); if(ev->oldSize().width() > )
{
double hRatio = double(ev->size().width()) / double(ev->oldSize().width());
double vRatio = double(ev->size().height()) / double(ev->oldSize().height()); if(hRatio != )
printf(""); double xLowBound = axisScaleDiv(xBottom).lowerBound();
double xUpperBound = axisScaleDiv(xBottom).upperBound();
double yLowBound = axisScaleDiv(yLeft).lowerBound();
double yUpperBound = axisScaleDiv(yLeft).upperBound(); setAxisScale(xBottom, hRatio * xLowBound, hRatio * xUpperBound);
double ystep = axisStepSize(xBottom);
setAxisScale(yLeft, vRatio * yLowBound, vRatio * yUpperBound, ystep); replot();
}
else
{
double minX = axisScaleDiv(xBottom).lowerBound();
double maxX = axisScaleDiv(xBottom).upperBound();
double minY = axisScaleDiv(yLeft).lowerBound();
double maxY = axisScaleDiv(yLeft).upperBound(); QRectF rectF = QRectF(minX, minY, maxX - minX, maxY - minY); QPointF centerPoint = rectF.center(); double Ratio = rectF.width() / rectF.height();
double hvRatio = double(canvas()->width()) / double(canvas()->height()); if(Ratio > )
{
double scaleFactor = hvRatio / Ratio > ? hvRatio / Ratio : ; setAxisScale(xBottom, centerPoint.x() - scaleFactor * rectF.width() / 2.0,
centerPoint.x() + scaleFactor * rectF.width() / 2.0);
double step = axisStepSize(xBottom);
setAxisScale(yLeft, centerPoint.y() - scaleFactor * rectF.width() / (2.0 * hvRatio),
scaleFactor * centerPoint.y() + scaleFactor * rectF.width() / (2.0 * hvRatio), step);
}
else
{
double scaleFactor = Ratio / hvRatio > ? Ratio / hvRatio : ; setAxisScale(yLeft, centerPoint.y() - scaleFactor * rectF.height() / 2.0,
centerPoint.y() + scaleFactor * rectF.height() / 2.0);
double step = axisStepSize(yLeft);
setAxisScale(xBottom, centerPoint.x() - scaleFactor * rectF.height() * hvRatio / 2.0,
centerPoint.x() + scaleFactor * rectF.height() * hvRatio / 2.0, step);
} replot();
}
}

Qt绘图控件qwt绘制等比例坐标图的更多相关文章

  1. paper 139:qt超强绘图控件qwt - 安装及配置

    qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图.它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式 ...

  2. qt超强绘图控件qwt - 安装及配置

    qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图.它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式 ...

  3. C#.NET常见问题(FAQ)-如何使用2D绘图控件ZedGraph绘制坐标轴和坐标曲线

    添加数据:示例添加了一条sin曲线和一条cos曲线,注意cos曲线比sin曲线点更密集(可以用这种方式控制点的采样疏密程度)   默认显示效果如下图所示,可以框选一个部分看放大效果   右击某个点可以 ...

  4. qt超强精美绘图控件 - QCustomPlot一览 及 安装使用教程

    1.概述 QCustomPlot 是一个超强超小巧的qt绘图类,非常漂亮,非常易用,只需要加入一个qcustomplot.h和qcustomplot.cpp文件即可使用,远比qwt方便和漂亮,可以自己 ...

  5. Qt 在控件上面绘图 label,pushbutton。。。。。

    最近有点时间,就研究研究Qt ,提升一下自己 我记得我在刚开始学习Qt 的时候,想要在一个控件上面绘制图形,那就要构建一个新类来调用该控件的绘图函数 今天看到了狗哥的学习博客,感觉自己好渺小啊,按照狗 ...

  6. 双缓冲绘图和窗口控件的绘制——ATL ActiveX 窗口控件生成向导绘制代码OnDraw的一个错误 .

    双缓冲绘图和窗口控件的绘制 ---ATL ActiveX 窗口控件生成向导绘制代码OnDraw的一个错误 cheungmine 我们通常使用ATL COM组件,生成一个带窗口的ActiveX控件,然后 ...

  7. VS2010 使用TeeChart绘图控件 - 之二 - 绘制图形(折线图,柱状图)

    1.前期准备 具体可见VS2010 使用TeeChart绘图控件 - 之一 控件和类的导入 1. 1 添加TeeChart控件,给控件添加变量m_TeeChart 添加TeeChart控件,右击控件, ...

  8. Qt编写控件属性设计器

    一.前言 自从研究Qt编写自定义控件以来,一发不可收拾,越多越多人有类似的需求找我定制控件,陆陆续续写了上百个控件,目前已超过150个,于是逐渐衍生了另外一个需求,提供一个控件属性设计器,类似QtDe ...

  9. 怎样在VS2013/MFC中使用TeeChart绘图控件

    TeeChart作为一款强大好用的绘图控件,通过它可以绘制出各式各样的图表,包括2D的,还有3D的,绘制的图表美观实用,这里主要讲述如何在VS2013/MFC中使用TeeChart控件,顺便说一下在V ...

随机推荐

  1. HDU 5164Matching on Array(AC自动机)

    这是BC上的一道题,当时比赛没有做,回头看看题解,说是AC自动机,想着没有写过AC自动机,于是便试着抄抄白书的模板,硬是搞了我数个小时2000ms时限1800过了= = ! 这里就直接贴上BC的结题报 ...

  2. UVaLive 6608 Cabin Baggage (水题)

    题意:给定四个数代表长宽高和重,问你是不是满足下面条件,长不高于56,宽不宽于45,高不高于25,或者总和不大于125,并且重量不高于7. 析:判断输出就好,注意这个题是或,不要想错了. 代码如下: ...

  3. C# Control 控件DrapDrop不触发的问题

    今天在做一个鼠标拖拽功能时,需要用到PictureBox的拖拽,即拖拽一个图标到PictureBox上实现加载绘制,可是怎么整也触发不了DrapDrop事件,最后终于找到了解决方法:原来需要在Drog ...

  4. linux 的 scp 命令 可以 在 linux 之间复制 文件 和 目录

    转自:http://blog.csdn.net/snlying/article/details/6184102 Linux系统中scp命令的用法. scp就是secure copy的简写,用于在lin ...

  5. Web性能优化之图片优化

    http://get.jobdeer.com/6513.get 其中APNG和WebP格式出现的较晚,尚未被Web标准所采纳,只有在特定平台或浏览器环境可以预知的情况下加以采用,虽然均可以在不支持的环 ...

  6. Form时间交叉验证唯一性

    *==================================================   ** PROCEDURE:   check_effcitive_utl      Descr ...

  7. sql注入在线检測(sqlmapapi)

    之前一搞渗透的同事问我.sqlmapapi.py是干啥的,我猜非常多人都玩过sqlmap,但玩过sqlmapapi的应该比較少,今天就和大家一起看看怎样使用以及一些美的地方. 说白了.sqlmapap ...

  8. Visual Studio 2015 和 Apache Cordova

    英文原版:http://www.codeproject.com/Articles/860150/Visual-Studio-and-Apache-Cordova 在开始前,问一下自己下面这些问题: 熟 ...

  9. 【JavaScript】关于prototype

    所有的对象都有constructor属性 但是只有function类型才有prototype属性----->值是一个对象,即prototype对象,所有的实例对象共享同一个prototype对象 ...

  10. POJ 3624 Charm Bracelet

    DP 一直是心中痛,不多说了,这个暑假就坑在这上了. 这暑假第一道DP题,01背包问题. 题意是说物品有 重量和价值 ,但你能承受的重量有限,问你能带的最大价值. 这题数组开大点,尽管不知道有啥坑点, ...