需要用到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 5776 sum (前缀和)

    题意:给定 n 个数,和 m,问你是不是存在连续的数和是m的倍数. 析:考虑前缀和,如果有两个前缀和取模m相等,那么就是相等的,一定要注意,如果取模为0,就是真的,不要忘记了,我当时就没记得.... ...

  2. LOTUS 迁移到Exchange 2010 POC 之在Exchange 2007 安装Lotus Admin!

    双击Setup安装:

  3. Function.caller

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/caller 非标准 ...

  4. ThinkPHP模板(一)

    如何关闭ThinkPHP的模板缓存 ThinkPHP的模板缓存是无奈关闭的,因为内置的模板引擎是一个编译型的模板引擎,必须经过编译后生成一个可执行的缓存文件才能被执行.但是可以设置缓存的有效期,例如设 ...

  5. C# ASP.NET Webservice调用外部exe无效的解决方法

    最近用asp.net做webservice,其中有个功能是调用执行外部的exe(类似cmd中执行),但执行Process.Start之后就没有结果,同样代码在winform下正常,折腾两天终于找到解决 ...

  6. 如何自学Java

    转自:http://www.360doc.com/content/12/0624/19/5856897_220191533.shtml   JAVA自学之路 JAVA自学之路 一:学会选择 为了就业, ...

  7. wpa_supplicant 移植及 linux 命令行模式配置无线上网

    本文涉及内容为linux 命令行模式配置无线上网 及 wpa_supplicant 移植到开发板的过程,仅供参考. 1.源码下载 wpa_supplicant 源码下载地址 :http://hosta ...

  8. MySql中的事件

    一.前言 自MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录.对数据进行汇总等等),来取代原先只能由操作系 ...

  9. ios开发——实用技术篇Swift篇&照片选择

    照片选择 // MARK: - 选择照片 /*----- 选择照片 ------*/ @IBAction func addImageButtonClick() { let actionSheet = ...

  10. sql server常用知识点

    --删除表 use [20130823_Recource] go drop table my_table1,my_table2,My_table3 --创建表 use [20130823_Recour ...