qwt官方例子-CurveDome
从效果展示,元素分析,代码分析来逐步说明qwt的使用方式。
本教程需要结合qwt的Class List来学习。
Qwt Class List: Qwt Class List:
项目源码:源码下载
效果展示
元素分析
元素分析中,将会说明本项目展示效果中的各个元素,方便小伙伴们学习并且灵活应用。
- 多种曲线类型:
- 绘制多条曲线
- 使用QRect添加曲线说明文字
- QPainter的一些简单使用
代码分析
从这个实例开始,实例代码已经逐渐开始多了,不再适合整体粘贴后分析,因此采用代码片段的方式进行,一般会从Qt的mian函数开始,通过函数或者类来进行分析。
主函数
#include <qwt_scale_map.h>
#include <qwt_plot_curve.h>
#include <qwt_symbol.h>
#include <qwt_math.h>
#include <qcolor.h>
#include <qpainter.h>
#include <qapplication.h>
#include <qfrfame.h>
int main ( int argc, char **argv )
{
QApplication a( argc, argv );
MainWin w;
w.resize( 300, 600 );
w.show();
return a.exec();
}
主函数比较简单,就是调用了一个类Mainwin
的对象w
,我们的重点要放在类Mainwin
的实现上面。注意,这也是一般的我们使用Qwt的方式,将我们需要绘制的图写到一个类里面,编写好功能和接口函数,然后再主函数或者其他类中调用。
MainWin类-h文件
// Array Sizes
const int Size = 27; //全局变量 每条曲线上面点的个数
const int CurvCnt = 6; //全局变量,曲线个数
// Arrays holding the values
double xval[Size]; //double类型的数组 备注:在C++中不推荐这么使用,推荐使用标准模板类库
double yval[Size]; //double类型的数组
QwtScaleMap xMap; //Info1
QwtScaleMap yMap;
class MainWin : public QFrame //MainWin类继承自QFrame. 备注:QwtPlot其实也是继承自QFrame的
{
public:
MainWin(); //构造函数
protected:
virtual void paintEvent( QPaintEvent * ); //Qt的绘图事件
void drawContents( QPainter *p ); //绘画函数
private:
void shiftDown( QRect &rect, int offset ) const; //偏移函数,用来实现不同图形放置在不同位置
QwtPlotCurve d_curves[CurvCnt]; //画布中的曲线数组,每个元素都是用来画一条曲线
};
Info1
QwtScaleMap xMap;
QwtScaleMap yMap;
参考文档:QwtScaleMap Class
QwtScaleMap
是一个比例尺类,可以提供一个逻辑区域到实际区域的坐标转换。所谓逻辑区域,就是真正的数据的区域,比如绘图数据的Y轴范围是[-1,1],那么数据的Y轴坐标的范围就是[-1,1];所谓实际区域,意思是绘图区域,不管数据本身的数据范围是多大,而是按照绘图去也的大小,进行整体的缩放。
在本例中,是将数据生成的曲线都成比例投影到一个QRect中,关键代码是:
// 设置比例刻度(逻辑区域)
xMap.setScaleInterval( -0.5, 10.5 );
yMap.setScaleInterval( -1.1, 1.1 );
//设置绘图区域
QRect r = contentsRect();
//设置绘图区域
xMap.setPaintInterval( r.left(), r.right() );
yMap.setPaintInterval( r.top(), r.bottom() );
painter->setRenderHint( QPainter::Antialiasing,
d_curves[i].testRenderHint( QwtPlotItem::RenderAntialiased ) );
d_curves[i].draw( painter, xMap, yMap, r );
MainWin类-cpp文件
我们主要来分析MainWin类的实现。
先来看构造函数。
----------
MainWin::MainWin