Qt绘图控件qwt绘制等比例坐标图
需要用到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绘制等比例坐标图的更多相关文章
- paper 139:qt超强绘图控件qwt - 安装及配置
qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图.它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式 ...
- qt超强绘图控件qwt - 安装及配置
qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图.它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式 ...
- C#.NET常见问题(FAQ)-如何使用2D绘图控件ZedGraph绘制坐标轴和坐标曲线
添加数据:示例添加了一条sin曲线和一条cos曲线,注意cos曲线比sin曲线点更密集(可以用这种方式控制点的采样疏密程度) 默认显示效果如下图所示,可以框选一个部分看放大效果 右击某个点可以 ...
- qt超强精美绘图控件 - QCustomPlot一览 及 安装使用教程
1.概述 QCustomPlot 是一个超强超小巧的qt绘图类,非常漂亮,非常易用,只需要加入一个qcustomplot.h和qcustomplot.cpp文件即可使用,远比qwt方便和漂亮,可以自己 ...
- Qt 在控件上面绘图 label,pushbutton。。。。。
最近有点时间,就研究研究Qt ,提升一下自己 我记得我在刚开始学习Qt 的时候,想要在一个控件上面绘制图形,那就要构建一个新类来调用该控件的绘图函数 今天看到了狗哥的学习博客,感觉自己好渺小啊,按照狗 ...
- 双缓冲绘图和窗口控件的绘制——ATL ActiveX 窗口控件生成向导绘制代码OnDraw的一个错误 .
双缓冲绘图和窗口控件的绘制 ---ATL ActiveX 窗口控件生成向导绘制代码OnDraw的一个错误 cheungmine 我们通常使用ATL COM组件,生成一个带窗口的ActiveX控件,然后 ...
- VS2010 使用TeeChart绘图控件 - 之二 - 绘制图形(折线图,柱状图)
1.前期准备 具体可见VS2010 使用TeeChart绘图控件 - 之一 控件和类的导入 1. 1 添加TeeChart控件,给控件添加变量m_TeeChart 添加TeeChart控件,右击控件, ...
- Qt编写控件属性设计器
一.前言 自从研究Qt编写自定义控件以来,一发不可收拾,越多越多人有类似的需求找我定制控件,陆陆续续写了上百个控件,目前已超过150个,于是逐渐衍生了另外一个需求,提供一个控件属性设计器,类似QtDe ...
- 怎样在VS2013/MFC中使用TeeChart绘图控件
TeeChart作为一款强大好用的绘图控件,通过它可以绘制出各式各样的图表,包括2D的,还有3D的,绘制的图表美观实用,这里主要讲述如何在VS2013/MFC中使用TeeChart控件,顺便说一下在V ...
随机推荐
- POJ 2886Who Gets the Most Candies?(线段树)
POJ 2886 题目大意是说有n个人围成一圈,游戏的起点是k,每个人持有一个数字(非编号)num,每次当前的人退出圈,下一个人是他左边的第num个(也就是说下一个退出的是k+num, k可以为负数, ...
- Js中获取frames中的元素
var oCombo = window.parent.frames["frmresourcetype"].document.getElementById('cmbType') ; ...
- 常见Java基础知识(较长)
1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象, ...
- libcurl API:CURLOPT_REFERER的用法
1.当你用libcurlAPI来请求某些数据时,发现返回的数据是0,这时候你就要去尝试用CURLOPT_REFERER来伪造一个来路页面:具体设置什么值可以通过浏览器来获取:按f12,在network ...
- flex中DataGrid里使用itemRenderer后数据无法绑定到数据源的问题
<?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:mx="ht ...
- Codeforces Gym 100803G Flipping Parentheses 线段树+二分
Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...
- linux C(hello world) 二维数组的练习
- 《Java并发编程实战》第三章 对象的共享 读书笔记
一.可见性 什么是可见性? Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化. 后者就是可见 ...
- ASP.NET方面的一些经典文章收集
1. 在ASP.NET中执行URL重写 文章地址:https://msdn.microsoft.com/zh-cn/library/ms972974.aspx 2. 在ASP.NET中如何实现和利用U ...
- LuaFileSystem学习心得
LuaFileSystem(简称lfs)是一个用于lua进行文件訪问的库,和Lua版本号同步.且是跨平台的,在为lua安装lfs之前须要先安装luarocks, luarocks是一个用于安装lua库 ...